快速排序

首先:我们要明白快速排序的原理!
1.我们一般选择数组的第一个元素来进行比较,这样可以方便我们递归调用。
2.首先设置一个Temp变量,然后从数组的最后一位向前移动,即找到一个小于Temp的数s[j],然后这个数就放入第一个位子
3.然后在从前到后寻找第一个大于等于Temp的数s[i],然后将上一步多出来的数s[i]放入s[j]的位置。
4.这样循环结束后Temp(原数组的第一个数)放入s[i]中,这样之后就表示在Temp的左边都是比Temp小的,而在右边则是大于Temp的数。
5.最后递归调用,完成整个数组的排序
void quick_sort(int s[], int l, int r)
{
    if (l < r)
    {
               
        int i = l, j = r, Temp = s[l];
        while (i < j)
        {
            while(i < j && s[j] >= Temp) // 从右向左找第一个小于Temp的数
                            j--; 
            if(i < j)
                            s[i++] = s[j];
                    
            while(i < j && s[i] < Temp) // 从左向右找第一个大于等于Temp的数
                            i++; 
            if(i < j)
                            s[j--] = s[i];
        }
        s[i] = Temp;
        quick_sort(s, l, i - 1); // 递归调用
        quick_sort(s, i + 1, r);
    }
}

时空复杂度分析:
	快排每次将排序数组分为两个部分,理想状况下,每一次都 将待排序数组划分成两个部分则需要logN次划分。
而在最坏情况下,即数组已经有序或是大致有序的情况下,每次划分只能减少一个元素,快速排序将不行变成了
冒泡排序,所以快速排序时间复杂度下界为O(NlogN),而最坏的情况为O(n^2),在实际的应用中快排的平均时间复
杂度为O(NlogN)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值