标签:
一 随机快速排序
随机快速排序是对快速排序的一种优化。
① 随机快速排序函数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 }
标签:
原文地址:http://www.cnblogs.com/yoleimei/p/4656849.html