赞
踩
- void QuickSort(int* a, int begin, int end)
- {
- if (begin >= end)
- return;
-
- int keyi = PartSort3(a, begin, end);
- //[begin,keyi-1]keyi[keyi+1,end]
- QuickSort(a, begin, keyi - 1);
- QuickSort(a, keyi + 1, end);
- }
- int PartSort(int* a, int left, int right)
- {
- int keyi = left;
- int prev = left, cur = prev + 1;
- while (cur <= right)
- {
- if (a[cur] < a[keyi] && (++prev) != cur)
- {
- Swap(&a[prev], &a[cur]);
- }
- cur++;
- }
- Swap(&a[prev], &a[keyi]);
- return prev;
- }
- void QuickSort(int* a, int begin, int end)
- {
- if (begin >= end)
- return;
-
- int keyi = PartSort3(a, begin, end);
- //[begin,keyi-1]keyi[keyi+1,end]
- QuickSort(a, begin, keyi - 1);
- QuickSort(a, keyi + 1, end);
- }
三数取中是取大小位于中间的值放到最左边,这样可以防止快排中最坏的情况出现O(n*2),也就是要排序的这一组数据接近有序或者就是有序的情况,那么使用了三数取中后这种最坏的情况就变成了最好的情况.
- //三数取中
- int GetMidi(int* a, int left, int right)
- {
- int midi = (left + right) / 2;
- if (a[left] < a[midi])
- {
- if (a[midi] < a[right])
- {
- return midi;
- }
- else if (a[right] < a[left])
- {
- return left;
- }
- else
- {
- return right;
- }
- }
- else//a[left]>a[midi]
- {
- if (a[left] < a[right])
- {
- return left;
- }
- else if (a[midi] > a[right])
- {
- return midi;
- }
- else
- {
- return right;
- }
- }
- }
当区间较小时可以使用插入排序来进行优化,因为插入排序最坏的情况就是要插入的数都比前面的数小,插入排序在小区间里面比较不错的一种排序算法,在快速排序里面使用插入排序可以提高很多的效率。
- void QuickSort2(int* a, int begin, int end)
- {
- if (begin >= end)
- return;
-
- if ((end - begin + 1) > 10)
- {
- int keyi = PartSort3(a, begin, end);
- //[begin,keyi-1]keyi[keyi+1,end]
- QuickSort(a, begin, keyi - 1);
- QuickSort(a, keyi + 1, end);
- }
- else
- {
- InsertSort(a+begin, end - begin + 1);
- }
- }
非递归的快速排序可以借助一个栈来实现,先入右边的值,再入左边的值,然后每次取值都是先取栈顶,也就是左边的值,然后再进行部分排序,直到返回的keyi-1=left,就代表着左边排序完成,右边返回的keyi+1=right,代表右边的部分排序完成。
- void QuickSortNonR(int* a, int begin, int end)
- {
- ST st;
- STInit(&st);
- STPush(&st, end);
- STPush(&st, begin);
- while (!STEmpty(&st))
- {
- int left = STTop(&st);
- STPop(&st);
-
- int right = STTop(&st);
- STPop(&st);
-
- int keyi = PartSort3(a, left, right);
- if (keyi + 1 < right)
- {
- STPush(&st, right);
- STPush(&st, keyi+1);
- }
- if (keyi - 1 > left)
- {
- STPush(&st, keyi-1);
- STPush(&st, left);
- }
- }
- STDestroy(&st);
- }
今天的分享到这里就结束了,感谢大家的阅读!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。