快速排序
2015-11-27 11:15
330 查看
快速排序算法
O(N*logN)
O(N*logN)
//插入排序 从小到大排序 template<typename T> void InsertionSort(T *A, int N){ int j, p; T tmp; for (p = 1; p < N; p++){ tmp = A[p]; for (j = p; j>0 && A[j-1] > tmp; j--){ A[j] = A[j - 1]; A[j - 1] = tmp; } } } //快速排序 const int CutOff = 3; //截止范围,用来处理小数组。可以大于3 //对于很小的数组,快速排序不如插入排序好。 //也避免了一些有害的特殊情形,如“三数中值分割法”的实际只有一个或两个元素的情况。 //快速排序的驱动程序 template<typename T> void QuickSort(T A[], int N){ Qsort(A, 0, N - 1); } template<typename T> void Qsort(T A[], int Left, int Right){ if (Left + CutOff <= Right){ //元素个数大于CutOff=3,则一定可以使用“三数中值分割法” int i = Left; int j = Right; //int center = (i + j) / 2; T pivot = A[i]; //以第一个元素为枢纽元 while (i < j){ while (i<j && A[j]>pivot){ j--; } if (i < j){ A[i] = A[j]; //i++; } while (i < j && A[i] < pivot){ i++; } if (i < j){ A[j] = A[i]; //j--; } } A[i] = pivot; Qsort(A, Left, i - 1); //递归调用 Qsort(A, i + 1, Right); } else{ InsertionSort(A + Left, Right - Left + 1); //使用插入排序 } } ////简单的确定枢纽元方法 //template<typename T> //T Median3(T *&A, int Left,int Right){ // int center = (Left + Right) / 2; // // int tmp = A[center]; // A[center] = A[Right - 1]; // A[Right-1] = tmp; // return A[Right - 1]; //}
相关文章推荐
- 8天学通MongoDB——第一天 基础入门
- LeetCode 113 Path Sum II
- jstl标签: c:Foreach详解
- http协议解析
- 代码统计
- 12-6 NSArray
- Linux的命令行中一些文本操作技巧的实例分享
- Android ImageView scaleType
- [数据挖掘]非线性支持向量机:核方法
- 压缩工具中zx,gzip,bzip2,打包工具tar
- wampserver2.4 phpstrom xdebug断点调试
- opencv 从原始的图像中找出ROI区域
- PHP连接打印机
- svn 库迁移
- [置顶] 分享一下微信支付经验以及JS代码
- 12月2日,上海Cloud Foundry Summit, Azure Cloud Foundry 团队期待和你见面!
- CSS入门(9)-overflow 属性
- IATF信息保障技术框架的核心思想--纵深防护
- 12月2日,上海Cloud Foundry Summit, Azure Cloud Foundry 团队期待和你见面!
- 12月2日,上海Cloud Foundry Summit, Azure Cloud Foundry 团队期待和你见面!