[算法导论][排序算法]快速排序(quick sort)

来源:互联网 发布:java面试笔试题 编辑:程序博客网 时间:2024/05/21 06:40
#include "main.h"#include <assert.h>#include <time.h>#include <stdlib.h>/************************************************************************* Quick sort is a kind of in-place sort. * Characters:* - Divide and Conquer.* - In place sort.* - Practical in use (with tunning).** Pseudo code* quickSort(A, p, r){*   if (p<r) q = partition(A, p, r)*   quickSort(A, p, q-1)*   quickSort(A, q+1, p)* }* * Quick sort is the most commonly used sorting algorithm, as it provides an average* O(nlogn) performance, and it is in place sort.** Average case performance : O(nlogn) (this is true for most of the inputs)* Worst case performance   : O(n^2)   (this will hardly happen if randomization is used for tunning)************************************************************************/// v1: original quick sort. without randomization for optimization.Int partition_v1(Int32 *piSrc, const Int32 iStart, const Int32 iEnd){assert(iStart<=iEnd);Int i   = iStart-1;Int key = piSrc[iEnd];for (Int j=i+1; j<iEnd; ++j){if (piSrc[j]<key){++i;Int tmp = piSrc[j];piSrc[j] = piSrc[i];piSrc[i] = tmp;}}++i;piSrc[iEnd] = piSrc[i];piSrc[i] = key;return i;}// v2: randomly choose a pivot for optimization.// which guarantees worst case performance bounded to O(nlogn).Int partition_v2(Int32 *piSrc, const Int32 iStart, const Int32 iEnd){assert(iStart<=iEnd);//Attention: the following srand(), rand() and % are too time-consuming//try to find better ways to generate a random number.srand(clock());Int pivot = iStart + ((Int32)rand() % (iEnd-iStart));assert(pivot<=iEnd && pivot>=iStart);Int tmp = piSrc[iEnd];piSrc[iEnd] = piSrc[pivot];piSrc[pivot] = tmp;//call partition_v1 actuallyInt i   = iStart-1;Int key = piSrc[iEnd];for (Int j=i+1; j<iEnd; ++j){if (piSrc[j]<key){++i;Int tmp = piSrc[j];piSrc[j] = piSrc[i];piSrc[i] = tmp;}}++i;piSrc[iEnd] = piSrc[i];piSrc[i] = key;return i;}void quickSort(Int32 *piSrc, const Int32 iStart, const Int32 iEnd){if (iStart>=iEnd){return;}else{Int iMid = partition_v1(piSrc, iStart, iEnd);quickSort(piSrc, iStart, iMid-1);quickSort(piSrc, iMid+1, iEnd);}}