您的位置:首页 > 其它

算法导论学习笔记(一)排序算法之快速排序

2016-03-07 22:11 429 查看
快速排序算法用到了分治的思想,将大数组分为两个小数组,且使得一个小数组均比某个数小,而另一个小数组均比这个数大,然后将这两个小数组继续划分,直至不可再分。

算导的伪代码

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);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: