快速排序

原创
2013/06/11 19:12
阅读数 631

1 排序思想:

通过一趟排序,将待排序记录分成两个部分,其中一部分的关键字都比另一部分的关键字小。再分别对这两部分进行排序,直到整个序列有序。

以整型数组为例,一趟快速排序的方法:

待排序序列为R[low...high],取一个基准,一般为R[low] 

设i=low,j=high-1

①从j向前搜索,直到j<=i或者R[j]< R[low],将R[j]与R[i]交换
②从i向后搜索,直到j<=i或者R[i]> R[low],将R[i]与R[j]交换
重复①、②步,直到j<=i,这样完成一趟排序,i就是最终基准所放置的位置

2 算法实现:

// 对num[]的[low,high)段执行快速排序
void quick_sort(int num[],int low,int high){
    if(low<high){
        int pivotloc=partion(num,low,high);
        quick_sort(num,low,pivotloc);
        quick_sort(num,pivotloc+1,high);
    }
}
// 对num[]的[low,high)段,按照num[low]分割成两部分
// 并返回最终num[low]所放置位置
int partion(int num[],int low,int high){
    int i=low,j=high-1;
    int key=num[low];
    while(i<j){
        while(i<j&&key<=num[j]) j--;
        SWAP(num[i],num[j]);
        while(i<j&&key>=num[i]) i++;
        SWAP(num[i],num[j]);
    }
    return i;
}
// 交换
#define SWAP(x,y) {int t; t = x; x = y; y = t;}

3 性能分析:

3.1 空间复杂度:在理想状态下是O(logn),最坏情况下是O(n)

3.2 时间复杂度:

最好情况:一趟排序需要对记录进行比较约n次,则总的时间复杂度要看执行划分的次数。理想情况下,每次划分都将序列分成两个等长的部分,则时间复杂度是O(nlogn)。最坏情况下,每次划分都只将序列分成一部分,时间复杂度是O(n^2)。

平均时间复杂度是O(nlogn)

当序列已经是正序,快速排序退化为冒泡排序。

3.3 稳定性:不稳定

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
5 收藏
0
分享
返回顶部
顶部