刚找到以前写的快排,发出来分享一下
package nuc.edu.lisheng;
import java.util.Arrays;
import java.util.Random;
public class QuickSort {
public static void main(String[] args) {
int [] a= {18,24,68,19,108,27};
System.out.println(Arrays.toString(a));
System.out.println("------------排序后");
//数组是线程安全的,所以无需返回值
QucikSortFinal(a);
System.out.println(Arrays.toString(a));
}
public static void QucikSortFinal(int [] a) {
//初次排序从0开始,到length-1结束
int left=0;
int right=a.length-1;
int standard=a[0];
QucikSortProcess(a, standard, left, right);
}
public static void QucikSortProcess(int [] a,int standard,int left,int right) {
//记录初始的左右位置,用以判断排序完成后左右长度,是否进行左右排序
int startleft=left;
int startright=right;
//为基准值寻找合适位置,从右往左扫描,从左往右扫描,一直循环,直到结束
A:while(left!=right) {
B:for(int i=right;i>=left;i--) {
//此处为<,不是<=,如果<=,数组中有相同数字,会出现死循环
if(a[i]<standard) {
//将i与left的值交换,将right的位置变为i,结束for循环
int j=a[i];
a[i]=standard;
a[left]=j;
right=i;
break B;
}
//如果基准值一开始就处于合适的位置,结束循环。防止基准值为最大或最小的数
if(i==left) {
//结束while循环
right=i;
}
}
C:for(int i=left;i<=right;i++) {
if(a[i]>standard) {
int j=a[i];
a[i]=standard;
a[right]=j;
left=i;
break C;
}
if(i==right) {
left=i;
}
}
}
//如果左侧有超过一位的数字,对左侧排序
if(left-startleft>1) {
QucikSortProcess(a, a[startleft], startleft, left-1);
}
//如果右侧有超过一位的数字,对右侧排序
if(startright-left>1) {
QucikSortProcess(a, a[left+1], left+1, startright);
}
}
}
运行结果,做过各种情况的测试
当基准值为最值的情况
当出现相同成员的情况
普通情况
问题总结:
需要考虑好有相同值的情况,避免死循环,从而使得a[i]<standard而不是<=,又出现了另一个问题,最小值在最左侧,最大值在最右侧(此算法基准值在最左侧),该怎么结束循环,这个坑烦了好久