快速排序

快速排序

我理解的快排就是找到一个数组中的一个值作为key值,从前往后与key比较,再从后往前与key值比较,(从小到大排序)key值左边的都是小于key的值,右边的都是大于key的值,两边不满足条件时交换两个数的位置arr[low]与arr[high],通过key值作为分界线,分成两部分,左边比右边的小。把左右两边的元素继续排序,直到所有元素都排列好。(“数组”中只有两个元素时,排列结束low==high退出循环)left与right相等不会继续执行。

  public static void MySort(int[] arr, int left, int right)
        {
            if (left < right)
            {
                int low = left;
                int high = right-1;
                int key = arr[(low + high) / 2];
                while (true)
                {
                // 从左到右判断 小的数小于key值low++继续向右判断
                    while (arr[low] < key && low < right)
                    {
                        low++;
                    }
                   // 从右到左判断 大的数大于key值high--向左判断
                    while (arr[high] > key && high > 0)
                    {
                        high--;
                    }
                    // 左右两边相等就是同一个数了跳出
                    if (low == high) break;
                    // 不通过新的变量交换两个数
                    arr[low] = arr[low] + arr[high];
                    arr[high] = arr[low] - arr[high];
                    arr[low] = arr[low] - arr[high];
                    // 防止数重复的时候进入死循环
                    if (arr[low] == arr[high]) low++;
                }
                // 调整key值左边的数顺序 左边的数都比key小(重复直到所有数都排好顺序)递归
                MySort(arr, left, low);
                // 调整key值右边的数的顺序 
                MySort(arr, low + 1, right);
            }  
        }

如果我有没考虑到的条件或者错误,请大佬指出来。谢谢啦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值