快速排序的主要思想就是:将待排序数组以某一个元素为阈值分为两个子列,一个子列包含所有比改阈值小的元素,另一个子列反之。这样只要将这两个子列排好序,整个数组也就排好序了。这里有一个关键的子过程就是划分的过程Partition,一般可以选择数组中任意的元素作为划分阈值,这里选择的是数组中最右端的元素。
Partition使用了二分查找类似的思想:使用两个索引器从数组的两端进行遍历,左边的索引器遇到比阈值大的元素停止,右边的索引器遇到比自己小的元素停止,然后交换这两个元素,依次循环。这样数组就划分为了比该阈值大和小(含等于)两个子列了。
两者的实现源码为:
|
template <class Item> int Partition(Item* data,int len) { Item tmp = data[len - 1];
int i = 0; int j = len - 1;
for (;;) { while (tmp > data[i]) i++;
while (tmp < data[--j]) { if (j == 1) break; }
if (i >= j) break;
Exch2Item(data[i],data[j]); } Exch2Item(data[i],data[len -1]); return i; } |
|
template <class Item> void QuickSort(Item* data,int len) { if (len <= 1) return ;
int i = Partition(data,len);
QuickSort(data,i); QuickSort(data + i,len - i); } |
测试程序为:
|
int main(int argc,char* argv[]) { using namespace sortAlg; int* data = InitData<int>(10,100); PrintData<int>(data,10,"before BubbleSort"); QuickSort(data,10); PrintData<int>(data,10,"after BubbleSort"); return 0; } |
需要说明和注意的是:InitData 和PrintData定义和实现在排序与查找——备用函数给出的,请参考上一篇文章。
浙公网安备 33010602011771号