常用排序算法详解:插入排序、交换排序与选择排序
需积分: 7 105 浏览量
更新于2024-08-19
收藏 309KB PPT 举报
"这篇文档介绍了三种常见的排序方法:选择排序、插入排序以及交换排序,包括它们的基本思想、时间复杂度和简单的C/C++程序实现。这些排序算法的时间复杂度都是O(n^2),适用于小规模数据或部分有序的数据排序。"
### 选择排序
选择排序是一种简单直观的排序算法。其基本思想是在每一轮排序中,从未排序的元素中找到最小(或最大)的元素,将其放到已排序序列的末尾。这个过程会重复n-1次,直到所有元素都有序。由于在排序过程中可能会改变相同元素的相对顺序,所以选择排序是不稳定的排序方法。其时间复杂度为O(n^2)。
```c
void selection_sort(int r[], int n) {
int i, j, min_idx;
for (i = 0; i < n - 1; i++) {
min_idx = i;
for (j = i + 1; j < n; j++) {
if (r[j] < r[min_idx]) {
min_idx = j;
}
}
if (min_idx != i) {
int temp = r[i];
r[i] = r[min_idx];
r[min_idx] = temp;
}
}
}
```
### 插入排序
插入排序分为直接插入排序和二分插入排序。直接插入排序是将每个元素插入到已排序序列的正确位置,每趟排序后,未排序部分的元素减少一个。而二分插入排序则在插入时利用二分查找,提高插入效率。两种插入排序的时间复杂度也是O(n^2)。
```c
// 直接插入排序
void insert_sort(int r[], int n) {
int i, j, t;
for (i = 1; i < n; i++) {
t = r[i];
j = i - 1;
while (j >= 0 && r[j] > t) {
r[j + 1] = r[j];
j--;
}
r[j + 1] = t;
}
}
// 二分插入排序
void binary_insert_sort(int r[], int n) {
int i, low, mid, high, t;
for (i = 1; i < n; i++) {
t = r[i];
low = 0;
high = i - 1;
while (low <= high) {
mid = (low + high) / 2;
if (t < r[mid]) {
high = mid - 1;
} else {
low = mid + 1;
}
}
for (j = i - 1; j >= low; j--) {
r[j + 1] = r[j];
}
r[low] = t;
}
}
```
### 交换排序
交换排序中最典型的是冒泡排序,通过不断比较相邻元素并交换,使得每一轮排序后最大的元素“浮”到数组的末尾。同样,冒泡排序的时间复杂度为O(n^2)。
```c
// 冒泡排序
void bubble_sort(int r[], int n) {
int i, j, t;
for (i = 0; i < n - 1; i++) {
for (j = 0; j < n - 1 - i; j++) {
if (r[j] > r[j + 1]) {
t = r[j];
r[j] = r[j + 1];
r[j + 1] = t;
}
}
}
}
```
以上就是选择排序、插入排序(直接插入与二分插入)以及交换排序(冒泡排序)的基本概念、时间复杂度和C/C++实现。这三种排序算法都属于基础排序,虽然在最坏情况下时间复杂度较高,但它们的实现简单,易于理解,对于小规模数据或者部分有序的数据,表现还是可以接受的。
点击了解资源详情
点击了解资源详情
点击了解资源详情
2024-06-13 上传
2018-07-04 上传
2021-07-15 上传
2023-08-26 上传
杜浩明
- 粉丝: 14
- 资源: 2万+
最新资源
- 火炬连体网络在MNIST的2D嵌入实现示例
- Angular插件增强Application Insights JavaScript SDK功能
- 实时三维重建:InfiniTAM的ros驱动应用
- Spring与Mybatis整合的配置与实践
- Vozy前端技术测试深入体验与模板参考
- React应用实现语音转文字功能介绍
- PHPMailer-6.6.4: PHP邮件收发类库的详细介绍
- Felineboard:为猫主人设计的交互式仪表板
- PGRFileManager:功能强大的开源Ajax文件管理器
- Pytest-Html定制测试报告与源代码封装教程
- Angular开发与部署指南:从创建到测试
- BASIC-BINARY-IPC系统:进程间通信的非阻塞接口
- LTK3D: Common Lisp中的基础3D图形实现
- Timer-Counter-Lister:官方源代码及更新发布
- Galaxia REST API:面向地球问题的解决方案
- Node.js模块:随机动物实例教程与源码解析