C++复习之冒泡排序&插入排序&希尔排序
2016-07-29 17:21
483 查看
冒泡排序时间复杂度最好的情况为 O(n), 最坏的情况是 O(n^2) ,基本思想是 : 两两比较相邻记录的关键字 , 如果反序则交换
改进思路:设置标志位,明显如果有一趟没有发生交换( flag = flase) ,说明排序已经完成
改进思路:记录一轮下来标记的最后位置,下次从头部遍历到这个位置就 Ok
插入排序 : 将一个记录插入到已经排好序的有序表中 , 从而得到一个新的 , 记录数增 1 的有序表,时间复杂度也为 O(n^2), 比冒泡法和选择排序的性能要更好一些
希尔排序 : 先将整个待排元素序列分割成若干子序列(由相隔某个 “ 增量 ” 的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时, 再对全体元素进行一次直接插入排序(增量为 1 )。其时间复杂度为 O(n^3/2), 要好于直接插入排序的
void bubbleSort1(int *arr, int n) { for (int i = 0; i < n; i++) { for (int j = 1; j < n - i; j++) { if (arr[j] > arr[j - 1]) { int tmp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = tmp; } } } }
改进思路:设置标志位,明显如果有一趟没有发生交换( flag = flase) ,说明排序已经完成
void bubbleSort2(int *arr, int n) { bool flag = true; while (flag) { flag = false; for (int i = 0; i < n; i++) { for (int j = 1; j < n - i; j++) { if (arr[j] > arr[j - 1]) { int tmp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = tmp; flag = true; } } } } }
改进思路:记录一轮下来标记的最后位置,下次从头部遍历到这个位置就 Ok
void bubbleSort3(int *arr, int n) { int flag = n; int k; while (flag > 0) { k = flag; flag = 0; for (int i = 0; i < n; i++) { for (int j = 1; j < k; j++) { if (arr[j] > arr[j - 1]) { int tmp = arr[j]; arr[j] = arr[j - 1]; arr[j - 1] = tmp; flag = j; } } } } }
插入排序 : 将一个记录插入到已经排好序的有序表中 , 从而得到一个新的 , 记录数增 1 的有序表,时间复杂度也为 O(n^2), 比冒泡法和选择排序的性能要更好一些
void insertSort(int *arr, int n) { int i, j, tmp; for (i = 1; i < n; i++) { tmp = arr[i]; for (j = i; j > 0, arr[j - 1] > tmp; j--) { arr[j] = arr[j - 1]; } arr[j] = tmp; } }
希尔排序 : 先将整个待排元素序列分割成若干子序列(由相隔某个 “ 增量 ” 的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时, 再对全体元素进行一次直接插入排序(增量为 1 )。其时间复杂度为 O(n^3/2), 要好于直接插入排序的
/* O(n^2) */ void ShellSort(int *arr, int N) { int i, j, increment; int tmp; for (increment = N / 2; increment > 0; increment /= 2) { for (i = increment; i < N; i++) { tmp = arr[i]; for (j = i; j >= increment; j -= increment) { if (arr[j - increment] > tmp) arr[j] = arr[j - increment]; else break; } arr[j] = tmp; } } }
相关文章推荐
- 使用C++实现JNI接口需要注意的事项
- JavaScript演示排序算法
- 关于指针的一些事情
- c++ primer 第五版 笔记前言
- share_ptr的几个注意点
- Lua中调用C++函数示例
- Lua教程(一):在C++中嵌入Lua脚本
- Lua教程(二):C++和Lua相互传递数据示例
- C++联合体转换成C#结构的实现方法
- C++高级程序员成长之路
- C++编写简单的打靶游戏
- C++ 自定义控件的移植问题
- C++变位词问题分析
- C/C++数据对齐详细解析
- C++基于栈实现铁轨问题
- C++中引用的使用总结
- 使用Lua来扩展C++程序的方法
- C++中调用Lua函数实例
- Lua和C++的通信流程代码实例
- C++的template模板中class与typename关键字的区别分析