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

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

算导的伪代码

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);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值