关于快速排序的一些讨论

学过数据结构的对快速排序应该不陌生

作为一种时间复杂度为nlog2n的排序算法 ,应该是有了解的

我在数据结构数上学的排序方法很常规

选定最左边的为基数,从左边开始遍历,碰到大于的停下,再从右边遍历,碰到小于的停下,直到指针遇到后,讲遇到的地方改为基数,再递归遍历,

但这样存在最坏的情况如果序列已经是排好了,每次都要遍历比较一遍,复杂度又回到了n

所以可以选择中间原理来遍历,这样就不需要每次遍历一遍


        void quick_sort(int s[], int l, int r)
        {
            if (l < r)
            {
                //Swap(s[l], s[(l + r) / 2]); //将中间的这个数和第一个数交换 参见注1
                int i = l, j = r, x = s[l];
                while (i < j)
                {
                    while(i < j && s[j] >= x) // 从右向左找第一个小于x的数
                        j--;  
                    if(i < j) 
                        s[i++] = s[j];
                    
                    while(i < j && s[i] < x) // 从左向右找第一个大于等于x的数
                        i++;  
                    if(i < j) 
                        s[j--] = s[i];
                }
                s[i] = x;
                quick_sort(s, l, i - 1); // 递归调用 
                quick_sort(s, i + 1, r);
            }
        }

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值