排序算法学习经验(一)
来源:互联网 发布:搞笑淘宝买家秀图聊天 编辑:程序博客网 时间:2024/06/05 17:02
近一周多呢在学习排序算法,
同时,我学习了算法大牛刘宇波的排序算法优化,比如双路快排和三路快排等。优化过程也将在以后的博客中详细写出,如有错误或描述不当之处,望指出,感激不尽。
关键点提要:
冒泡排序、选择排序、插入排序、shell排序
归并排序、归并排序优化、快速排序、双路快排、三路快排
堆排序及其优化等其他排序方法
首先是在平均情况下,时间复杂度为O(n^2)的几种排序。
冒泡排序
冒泡排序的实现包含一个双重for循环,每次循环都把合适的元素向上浮,让合适的元素冒泡到合适的位置。C++实现代码如下:
template<typename T>void BubbleSort(T arr[], int n){ for (int i = 0; i < n - 1; i++) { //冒泡的过程 for (int j = n - 1; j > i; j--) { if (arr[j] < arr[j - 1]) swap(arr[j], arr[j - 1]); } }}
选择排序
选择排序和冒泡排序类似,选择排序是在每次循环中,找到合适的元素,直接放到合适的位置,与冒泡排序相比少了很多次交换次数,略微提高了效率。C++实现代码如下:
template<typename T>void selectionSort(T arr[], int n){ for (int i = 0; i < n; i++) { int minIndex = i;//设立当前子串最小下标 for (int j = i + 1; j < n; j++) { //若当前元素比最小下标对应的元素还要小, //则更新当前子串最小下标 if (arr[j] < arr[minIndex]) minIndex = j; } swap(arr[i], arr[j]);//将元素调到合适的位置 }}
插入排序
插入排序图例说明:
1.初始情况:
2.第一个考虑的元素,直接完成插入
3.第二个考虑的元素
4.与前面的子串相比较插入合适的位置
5.第三个要考虑的元素
6.第一次与前面的比较,比前一个数小,则交换位置
7.第二次与前面的比较,比前一个数小,又交换位置,此时完成了第三个数的插入
8.第四个元素
9.第四个元素第一次比较,比前一个数小,交换位置
10.第四个元素第二次比较,比前一个数小,交换位置
11.此时比前一个元素大,结束第四个元素的插入
依此类推,完成所有元素的排序。
下面是C++的代码:
template<typename T>void insertionSort(T arr[], int n){ for (int i = 1; i < n; i++) { int j; for (j = i; j > 0 && arr[j - 1] > arr[j]; j--) { swap(arr[j], arr[j - 1]); } }}
插入排序还有一个小小的优化代码,有兴趣的可以看看:
template<typename T>void insertionSort(T arr[], int n){ for( int i = 1 ; i < n ; i ++ ) { T e = arr[i]; int j; // j保存元素e应该插入的位置 for (j = i; j > 0 && arr[j-1] > e; j--) arr[j] = arr[j-1]; arr[j] = e; }}
shell排序
shell排序和插入排序类似,就是讲原来的依次插入变成将一个数组分组,对子序列进行插入排序,最后把子序列组合起来。
template<typename T>void shellSort(T arr[], int n){ int h = 1; while( h < n/3) h = 3 * h + 1; for(int i = h; i < n; i++) { T e = arr[i]; int j; // 对 arr[i], arr[i-h], arr[i-2*h], arr[i-3*h]... //使用插入排序 for(j = h; j >=h && e < arr[j - h]; j -= h) arr[j] = arr[j - h]; arr[j] = e; }}
下一篇将会在两天后更新,如本篇博客有错误或描述不当之处,望指出,感激不尽。
- 排序算法学习经验(一)
- 排序算法学习经验(二)
- 排序算法学习经验(三)
- 排序算法学习经验(四)
- 排序算法学习(一)
- 算法学习(排序一)插入排序
- 算法学习(一)----基本排序算法
- 八大排序算法学习笔记:插入排序(一)
- 算法学习(一、冒泡排序)
- 排序算法学习系列(一)
- 算法学习(一)-插入排序
- 算法学习篇一(排序算法(Java实现))
- 算法学习之排序算法(一)(冒泡法)
- 算法学习之排序算法(一)(冒泡法)
- java排序算法学习(一)--冒泡排序
- java排序算法学习(一)--选择排序
- 排序算法(一)
- 排序算法(一)
- 高精度模板
- java简单界面实现
- Day01
- 总结5(作业3)
- 在Android Studio中实现OpenCV人脸检测
- 排序算法学习经验(一)
- vector的实现【C++】
- Python学习笔记2—变量与运算符
- Python基础教程(5)条件、循环和其他语句
- 类、对象、接口
- ASP.NET状态管理之九(会话Session)
- 非零环绕原则
- Kubernetes1.7新特性:支持绕过docker,直接通过containerd管理容器
- hdoj 5532 Almost Sorted Array