快排

static void Fun(int[] arr,int left,int right)//快排
{
if (left<right)
{
int middle = arr[left];//选取的记录值(左边)
int i = left;
int j = right;
while (i<j)
{
while (i < j)
{
if (arr[j]>middle)
{
arr[i] = arr[j];
break;
}
else
{
j–;
}
}
while (i<j)
{
if (arr[i] <= middle)
{
arr[j] = arr[i];
break;
}
else
{
i++;
}
}
}
arr[i] = middle;
Fun(arr, left, i - 1);
Fun(arr,i+1,right);
}

    }
    1. 确定该次的排序范围,就是fun参数中的left, right,如果left<right才继续往下走。
  1. 先从左端拿第一个数做为基准值,就是上面代码中的b( base ) = arr[left]。
  2. 遍历索引:j,先从右往左遍历,如果遍历索引j==i,或,arr[j]>b,就记录起当前的位置(j),并退出遍历。
  3. 遍历索引:i,再从左往右遍历,如果遍历索引i==j,或,arr[i]<b,就记录起当前的位置(i),并退出遍历。
  4. 判断刚刚记录的索引:i==j,说明左、右遍历走到一起了(同一个位置,说明左右都遍历玩了),那么将b基准值的位置与当前i的位置交换,即:arr[left]=arr[i], arr[i]=b,arr[left]其实就是b(从第2点我们可以确定),并开启新的两个排序范围,分别是:相对i索引位置的:左边(lefti-1)、右边(i+1right)两部分,这两部分范围再以递归的重复第1~6点的所有步骤;
  5. 判断刚刚记录的索引:i!=j,那么将arr[i]与arr[j]的值互换(将小的值往左放,大的往右放,二分的思想其实很多地方都可以用到),再重复1~4。
  6. 不想分析了 就找了个分析好的
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值