快速排序(Quick sort),是一种分治算法的实现,其思想为:在待排序数列里面选择一个基准(pivot)将数列分为两个部分,其中基准之前的部分都比基准值小,后半部分大于基准值,这个操作称之为分区(partition);然后分别对前后半部分进行分区操作。
算法示例:
待排序数组:10 6 3 7 2 8 9 2 4 1 n = 10
首先进行分区。令 left 表示左边界,right 表示右边界,pivot表示基准值。left = 0,right = 9,pivot = d[left]。
然后,从右向左遍历(right--)找到第一个小于pivot的位置,此时为 right = 9。令 d[left] = d[right],left++。
得到: 1 6 3 7 2 8 9 2 4 1
然后,从左向右遍历(left ++)找到第一个大于pivot的位置,此时 left = 9。因为 left == right,所以退出循环。
最后,令 d[left] = pivot,得到分好区的数列:1 6 3 7 2 8 9 2 4 10,返回基准值的位置 left = 9。
分好区之后,以基准值位置为界对前后两部分的数组进行分区操作,最后就得到了排好序的数组。
int partition(double *dataIn, int iLeft, int iRight)
{/* 2012/08/24, by wbprime@myopera.com */
int left = iLeft, right = iRight;
double pivot = dataIn[left];
while (left < right) {
/* from right to left */
while (left < right && dataIn[right] > pivot) right--;
if (left < right) dataIn[left++] = dataIn[right];
/* from left to right */
while (left < right && dataIn[left] < pivot) left ++;
if (left < right) dataIn[right--] = dataIn[left] ;
}
dataIn[left] = pivot;
return left;
}
int quickSort(double *dataIn, int iLeft, int iRight)
{/* 2012/08/24, by wbprime@myopera.com */
if (iLeft < iRight) {
int index = partition(dataIn, iLeft, iRight);
quickSort(dataIn, iLeft, index-1);
quickSort(dataIn, index+1, iRight);
}
}
void sort(double *dataIn, int sizeIn)
{/* 2012/08/24, by wbprime@myopera.com */
quickSort(dataIn, 0, sizeIn-1);
}