快速排序

来源:互联网 发布:部分便筏元数据已损坏 编辑:程序博客网 时间: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
原创粉丝点击