快速排序
来源:互联网 发布:部分便筏元数据已损坏 编辑:程序博客网 时间:2024/06/13 23:23
<span style="font-size:18px;">#include <iostream>#define SWAP(a,b) ( (a)==(b) ? ( (a) = (b) ) : ( (a)^=(b)^=(a)^=(b) ) )//注意加括号以及判断是否相等typedef int elementType;using namespace std;void insertSort(elementType a[], int n)//可优化 见博客 插入排序{for(int i = 1; i < n; ++i){ elementType e = a[i]; int j; for( j = i - 1; j>=0 && a[j] > e; --j) a[j+1] = a[j]; a[j+1] = e;}}//从begin end 和 (begin + end)/2 这三个位置上找中位数 //将最小的放到 begin 的位置 , 对 qsort中的j 有个警戒作用防止访问数组越界//将最大的放到end位置 对 qsort中的i 有个警戒作用防止访问数组越界//将居中的放到 (begin + end)/2位置//将(begin + end)/2 位置上的数与 end - 1 的位置上的数进交换elementType madian3(elementType a[], int begin, int end){int center = (begin + end) / 2; if( a[begin] > a[center]) SWAP(a[begin], a[center]); if( a[begin] > a[end] ) SWAP(a[begin], a[end] ); if( a[center]> a[end] ) SWAP(a[center], a[end] ); SWAP(a[center] , a[end - 1]); return a[end - 1];}</span></span>
<span style="font-size:18px;"><span style="font-size:18px;">/*优化如下:1.选取的枢纽元为 元素结合中 前中后这三者位置居中的元素。好处: 避免了 由于快速排序不稳定 当输入集合为有序的时候带来的性能变差的问题其实取输入结合的中位数最好但是中位数的选取对于排序来说复杂度太大,随机数生成器同样道理。2.对于与枢纽元相等的元素来说,应该也要让他们进行相应的操作(交换) 否则将会导致生成的“递归树”退化。 3.当对于数据规模 n<= 15 时, 可以不用快速排序递归的进行,反而用 插入排序效果更好 */ #define cutoff (8)// 必须大于0否则在处理 大小小于 2 的 区间的时候将发生错误不信你可以改成0试试 //双向void qSort(elementType a[], int begin, int end){if(begin + cutoff < end) {elementType pivot = madian3(a, begin, end);int i = begin, j = end -1;while(1){while(a[++i] < pivot);while(a[--j] > pivot);if(i < j) SWAP(a[i], a[j]);else break;}/*如果改成 int i = begin+1, j = end -2;while(1){while(a[i] < pivot) i++;while(a[j] > pivot) j++;if(i < j) SWAP(a[i], a[j]);else break;}当遇到a[i] == a[j] 时死循环 */ SWAP(a[i], a[end - 1]);qSort(a, begin, i - 1);qSort(a, i + 1, end );}else{insertSort(a+begin, end - begin + 1);}}</span>
<span style="font-size:18px;">//单向void qSort2(elementType a[ ], int begin , int end){if(begin + cutoff < end) {elementType pivot = madian3(a, begin, end);int i = begin, j = begin+1; while(j <= end) { if(a[j] < pivot ) //保持稳定性 { i++; SWAP(a[i], a[j]); } j++; }SWAP(a[i+1], a[end - 1]);qSort(a, begin, i - 1);qSort(a, i + 1, end );}else{insertSort(a+begin, end - begin + 1);}}//对排序程序进行封装void quickSort(elementType a[], int size){qSort2(a, 0, size - 1 );}</span>
0 0
- 快速排序
- 快速排序
- 快速排序
- 快速排序!
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 快速排序
- 基于Spring框架的Shiro配置
- 第一篇博客
- android显示特殊符号
- 查看Android应用包名、Activity的几个方法
- Hive数据导入导出的几种方式
- 快速排序
- iOS 音频被打断恢复
- iOS图片消耗内存过大的处理
- ubuntu 12.04.5下利用nginx 搭建RTMP服务器
- input password 明文显示
- leetcode:111 Minimum Depth of Binary Tree-每日编程第三十题
- 博客已经迁移至GitHub:http://cering.github.io/
- ios objective-c java php des加解密统一
- java核心API之String,StringBuffer和StringBuilder以及equals与==的区别和联系