第一篇 写快速排序,我也是万万没想到,不过现学现卖,参考博客https://blog.csdn.net/sunhuaqiang1/article/details/52059322
根据这篇博客讲解的的原理手敲了一个快速排序,以便理解添加了独门的注释(只有我能看懂)代码可以精简,但实在是不想动了
吐槽(万恶的小偷偷了我的手机,丧尽天良,手机卡还补不了,移动的登录逻辑有问题,服务密码登录,需要验证码,不使用服务密码登录,只要有验证码就行了,那服务密码有个锤子用,为啥我拿身份证去还要输入服务密码)头脑里尽是些胡思乱想
// 快速排序
// left 起始位置下标
// right 最后一位下标 最大长度-1
// 先定a[0]为基准数 从尾部向前遍历(j--) 找到比基准数小的就 进入内层循环
// 内层循环 i从头部到j的位置 遍历 (i++) 找到比基准数大的就 让i和j 互换
void fasterSort(int[] a,int left,int right){
if(left>=right){
return;
}
int head = left; //i的起点 head体现i实际到哪了
int foot = right;//j的起点
int bnum=left; //基准的位置下标
int base = a[left];//以头部首位(左边第一个)为基准数
for(int j = foot;j>=0;j--){ //j从后向前遍历
if(a[j] <= base && head < j){ //遇到比基准小的停下
for(int i=head;i<=j;i++){ //i从前往后遍历, i=head i每次从上次停下的位置开始
head = i; //用于外层定位 i是否和j相遇
if(a[i]>base){ //i 遇到比基准大的停下
// 此时 i 和j 互换
int temp = a[j];
a[j] = a[i];
a[i] = temp;
break; //跳出i的循环回到j的循环 再次从j开始 往前移动 直到i和j 相遇
}
}
}
if(head==j){// j遇上了i 一轮结束了
// 将基准数放到他们相遇的位置 以新的基准(他们相遇位置的数 放到头部首位成为新基准)重新开始排顺
int base2 = a[head];
a[head] = a[left];
a[left] = base2;
bnum = j; //基数的位置
break;
}
}
for(int i = 0 ;i<a.length;i++){
System.out.print(a[i]+",");
}
System.out.println();
// fasterSort(a,0,right);
fasterSort(a,left,bnum-1); //处理基准数前面的
fasterSort(a,bnum+1,right);//处理基准数后面的
}