快速排序算法用到了分治的思想,将大数组分为两个小数组,且使得一个小数组均比某个数小,而另一个小数组均比这个数大,然后将这两个小数组继续划分,直至不可再分。
算导的伪代码
PARTITION(A,p,r)
1 x = A[r]
2 i = p - 1
3 for j = p to r-1
4 if A[j] <= x
5 i = i + 1
6 exchange A[i] with A[j]
7 exchange A[i+1] with A[r]
8 return i + 1
j为当前被排序数的下标,i指向最后一个比标准数小的数;
即在前j-p个数中,有p-i-1个数比标准数小。
当某个数比标准数小时,与A[i]交换,则将大数置后,而将小数置前;
最后因为A[i]
算法分析
快速排序在最好情况下,时间复杂度为O(n lg n),而在最坏情况下,时间复杂度为O(n•n),但是其期望时间复杂度为O(n lg n)。虽然快速排序在一定情况下比分治排序满,但它有一个优点:快速排序为原址排序。当内存不够用的时候,快速排序仍可以稳定的运行;而分治排序需要申请更多的内存空间,才能稳定运行。
部分代码
void exchange(int *x,int *y)
{
if((*x) != (*y)){
(*x)^=(*y);
(*y)^=(*x);
(*x)^=(*y);
}
}
int partition(int *sortArray,int left,int right)
{
int i = left - 1;
for(int j = left; j < right; ++j){
if(sortArray[j] <= sortArray[right]){
i++;
exchange(&sortArray[i],&sortArray[j]);
}
}
exchange(&sortArray[i+1],&sortArray[right]);
return i+1;
}
void quickSort(int *sortArray,int left,int right)
{
if(left<right){
int q = partition(sortArray,left,right);
quickSort(sortArray,left,q-1);
quickSort(sortArray,q+1,right);
}
}