浅析常用排序算法
来源:互联网 发布:淘宝客 模版 编辑:程序博客网 时间:2024/05/21 11:18
1.排序算法的评价
涉及到时间复杂度(最差、平均、最好)
空间复杂度(需要额外的内存空间)
稳定性(两个相等键值R和S,原串R在S前,排序后R还在S前,称为稳定)
2.涉及到的排序算法
插入排序、冒泡排序、选择排序、快速排序、堆排序、归并排序、基数排序、希尔排序。
3.插入排序
源数据集: 64 5 7 89 5 24 32 18 40
初始化 : {64} 5 7 89 5 24 32 18 40
第一次排序: {5 64} 7 89 5 24 32 18 40
第二次排序 {5 7 64} 89 5 24 32 18 40
第三次排序 {5 7 64 89} 5 24 32 18 40
第四次排序 {5 5 7 64 89} 24 32 18 40
第五次排序 {5 5 7 24 64 89} 32 18 40
第六次排序 {5 5 7 24 32 64 89} 18 40
第七次排序 {5 5 7 18 24 32 64 89} 40
第八次排序 {5 5 7 18 24 32 64 89 40}
函数代码
template<class T>void InsertSort(T arr[], int len){for (int i = 0; i < len - 1; i++){int j = i;T temp = arr[i+1];while (temp < arr[j] && j >= 0){arr[j+1] = arr[j];j--;}arr[j+1] = temp;}}时间复杂度: 最好情况 O(n) 最坏情况O(n*n) 平均情况O(n*n)
稳定性 : 稳定
空间复杂度:O(1)
4. 冒泡排序
源数据集: 64 5 7 89 5 24 32 18 40
第一次排序: 5 7 64 5 24 32 18 40 89
第二次排序 5 7 5 24 32 18 40 64 89
第三次排序 5 5 7 24 18 32 40 64 89
第四次排序 5 5 7 18 24 32 40 64 89
第五次排序 5 5 7 18 24 32 40 64 89
函数代码
template<class T>void BubbleSort(T arr[], int len){bool cmpFlag = true;for (int i = 0; i < len - 1 && cmpFlag; i++){cmpFlag = false;for (int j = 0; j < len - i - 1; j++){if (arr[j] > arr[j+1]){Swap(arr[j], arr[j+1]);cmpFlag = true;}}}}
时间复杂度: 最好情况O(n) 最坏情况O(n*n) 平均情况O(n*n)
稳定性: 稳定
空间复杂度:O(1)
5.选择排序
源数据集: 5 7 89 5 24 32 2 40
第一次排序: 2 7 89 5 24 32 5 40 //不稳定的例子
第二次排序 2 5 89 7 24 32 5 40
第三次排序 2 5 5 7 24 32 89 40
第四次排序 2 5 5 7 24 32 89 40
第五次排序 2 5 5 7 24 32 89 40
第六次排序 2 5 5 7 24 32 89 40
第七次排序 2 5 5 7 24 32 40 89
函数代码
template<class T>void SelectSort(T arr[], int len){for (int i = 0; i < len - 1; i++){T min = arr[i];int index = i;for (int j = i; j < len; j++){if (min > arr[j]){min = arr[j];index = j;}}if (index != i)Swap(arr[i], arr[index]);}}
时间复杂度:最好情况 O(n*n) 最坏情况O(n*n) 平均情况O(n*n)
稳定性: 不稳定
空间复杂度:O(1)
6.快速排序
源数据集: 64 5 7 89 5 24 32 18 40
第一次快排: 40 5 7 89 5 24 32 18 64
40 5 7 64 5 24 32 18 89
40 5 7 18 5 24 32 64 89
.....................
函数代码
template<class T>void QuickSort(T arr[], int len){QuickSort(arr, 0, len-1);}template<class T>void QuickSort(T arr[], int low, int high){if (low >= high)return;T key = arr[(low+high)/2];int i = low, j = high;while (i < j){while (i < j && arr[j] > key)j--;while (i < j && arr[i] < key)i++;if (i < j){Swap(arr[i], arr[j]);i++;j--;}if (i >= j)break;}QuickSort(arr, low, j);QuickSort(arr, j+1, high);}
时间复杂度:最好情况O(nlog2n) 最坏情况O(n*n) 平均情况O(nlog2n)
稳定性:不稳定
空间复杂度: 平均O(log2n)
7.堆排序
函数代码
template<class T>void CreateHeap(T arr[], int n, int h){int i = h;int j = 2 * i + 1;T temp = arr[i];bool flag = true;while (j < n && flag){if (j < n - 1 && arr[j] < arr[j+1])j++;if (temp > arr[j]){flag = false;}else{arr[i] = arr[j];i = j;j = 2 * i + 1;}}arr[i] = temp;}template<class T>void InitCreateHeap(T arr[], int len){for (int i = (len - 1) / 2; i >=0; i--)CreateHeap(arr, len,i);}template<class T>void HeapSort(T arr[], int len){InitCreateHeap(arr, len);for (int i = len - 1; i > 0; i--){T temp = arr[0];arr[0] = arr[i];arr[i] = temp;CreateHeap(arr, i, 0);}}
时间复杂度: 最好情况 O(nlog2n) 最坏情况O(nlog2n) 平均O(nlog2n)
稳定性: 不稳定
空间复杂度: O(1)
8. 归并排序
源数据集: 64 5 7 89 5 24 32 18 40
第一次归并: 5 64 7 89 5 24 18 32 40
第二次归并: 5 7 64 89 5 18 24 32 40
第三次归并: 5 5 7 18 24 32 64 89 40
第四次归并: 5 5 7 18 24 32 40 64 89
函数代码:略
时间复杂度:O(nlog2n)
稳定性: 稳定
空间复杂度: O(n)
9. 基数排序
基数排序
时间复杂度 O(d(n+radix))
稳定性 : 稳定
空间复杂度 O(radix)
10. 希尔排序
时间复杂度 O(n^(1-2之间))
稳定性 不稳定
空间复杂度 O(1)
11. 小结
- 浅析常用排序算法
- 浅析常用排序算法
- 浅析常用的排序算法
- 浅析常用的排序算法
- 十种常用排序算法浅析 附C++实现
- 浅析常用排序算法的思想及实现
- 浅析快速排序算法
- 八大排序算法浅析
- 快速排序算法浅析
- 排序算法理解浅析
- 常见排序算法浅析
- 排序算法--插入排序浅析
- 浅析排序算法的稳定性
- 常用车牌定位算法浅析
- 排序算法浅析——插入排序
- 排序算法浅析——交换排序
- 浅析各类排序算法(八) 归并排序
- 排序算法浅析——选择算法
- Android: 判断service运行状态
- D3DPOOL(资源池)
- boost::checked_delete作用介绍
- 对D3D中AGP显存、内存、显存三种内存的解释
- 利用ADO打造Excel数据库
- 浅析常用排序算法
- Oracle登陆
- D3DPOOL和D3D资源
- 【科研论文】基于以太网通信的等效设备设计
- 【cocos2d-x】利用CCScrollView, 实现帮助界面
- CEGUI-AnimationSystem
- LNK2001
- TabHost管理的activity中的onFling事件无效问题解决方案
- 关闭浏览器在打开浏览器内容回填(类似微博)