java中排序算法 快速_java排序算法(快速排序)

快速排序

思路

在数组中寻一中间数,将比中间数小的放在左边,将比中间数大的放在右边

从左边开始找,找到比中间数大的,记住,从右边开始找,找到比中间数小的,然后交换两边

然后在左边再寻一中间数,同坐上面的事,右边也一样,然后循环

实现

数组:[2,6,3,6,5,9,1]

输出:[1 2 3 5 6 6 9 ]

private static void paixu(int[] arrs, int h, int e) {

int head =h;

int end = e;

int x=(h+e)/2;//中间值的位置

while (h <= e){//两个指针还没有遇到

while (arrs[x]>arrs[h]){//从左边开始找,找到比中间值大的数

h++;

}

while (arrs[x]< arrs[e]){//从右边开始查找,找到比中间值小的

e--;

}

//交换值

int m;

m = arrs[h];

arrs[h] = arrs[e];

arrs[e] = m; //2,6,3,6,5,9,1

h++; //2,1,3,6,5,9,6

e--; //2,1,3,5,6,9,6

}

//递归查询左右两边

if (head < e){

paixu(arrs,head,e);}

if (end > h){

paixu(arrs,h,end);}

}

为什么会有h++,e--呢

跟一下代码

输入数组[2,6,3,6,5,9,1]

第一次运行

中间位置是3,值是6

左边是0,右边是6

dca38719689f2ca400a96acbce108565.png

往下执行

f6897ec59d33c6597732552ba9ae691b.png

h=1,e=6

数组变成[2,1,3,6,5,9,6]

a09b6ba55136edb2fa18a1f1222486b6.png

执行加减操作 h=2,e=5;然后开启第二轮的执行

假如不进行加减操作,

继续执行的话,左边继续判断,当查询到6的时候停止,

右边查询,查询到6的时候停止,然后交换,6和6交换,然后再次开启循环,就会死循环,

当执行加减操作之后,再次判断的时候,就会从交换数据之后的索引开始判断,就不会再次判断了,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值