快速排序

 

一 随机快速排序

  随机快速排序是对快速排序的一种优化。

  ① 随机快速排序函数randomizedQuickSort是一个二分递归函数,退出递归条件为 beginIdx >= endIdx

  ② 在正式快速排序之前,需要将第一个数与随机一个带排序范围内的数进行交换,这就是随机快排中"随机"的含义

  ③ 定义新的newBegin/newEnd索引,将newBegin位置的数设为基准数base,想象newBegin位置已空缺

  ④ 当newBegin<newEnd时:从newEnd位置向前搜索(此时newEnd在减小),直到找到比base小的数,将此数填补到newBegin的位置,想象此时newEnd位置已空缺;再从newBegin位置向后搜索(此时newBegin在增大),直到找到比base大的数,将此数填补到newEnd的位置,想象此时newBegin位置已空缺。一直循环向前、向后搜索,直到newBegin==newEnd,最后将base填补到newBegin的位置。此时,所有小于base的数都在base之前,所有大于base的数都在base之后,而base已在它应该在的位置。再递归调用randomizedQuickSort(beginIdx, newBegin-1)、randomizedQuickSort(newEnd+1, endIdx)。

总结:一个while内嵌套两个while。

 1 void randomizedQuickSort(int *myArray, int beginIdx, int endIdx)
 2 {
 3     if (beginIdx < endIdx)
 4     {
 5         srand((unsigned int)time(NULL));
 6         int offset = rand() % (endIdx - beginIdx);
 7         swap(myArray[beginIdx],myArray[beginIdx+offset]);
 8 
 9         int newBegin = beginIdx;
10         int newEnd = endIdx;
11         int base = myArray[newBegin];
12 
13         while (newBegin < newEnd)
14         {
15             while ((newBegin < newEnd) && (myArray[newEnd] >= base))
16                 newEnd--;
17             myArray[newBegin] = myArray[newEnd];
18             while ((newBegin < newEnd) && (myArray[newBegin] <= base))
19                 newBegin++;
20             myArray[newEnd] = myArray[newBegin];
21         }
22         myArray[newBegin] = base;
23         
24         randomizedQuickSort(myArray, beginIdx, newBegin-1);
25         randomizedQuickSort(myArray, newEnd+1, endIdx);
26     }
27 }

 

posted @ 2015-07-18 14:30  yoleimei  阅读(122)  评论(0编辑  收藏  举报