将数组中的第一个元素作为基准数,定义两个常量start,end。start从前往后找比基准数大的,end从后往前找比基准数小的。
找到之后,交换start和end指向的元素,循环这一个过程,直到指向同一个元素,该位置就是基准数的位置,让其归位。
public class QuickSort {
public static void main(String[] args) {
//1.定义一个数组
int[] arr={6,1,2,7,9,3,4,5,10,8};
quickSort(arr,0,arr.length-1);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i]+" ");
}
}
/**
*
* @param arr 待排序的数组
* @param i 开始的索引
* @param j 结束的索引
*/
public static void quickSort(int[] arr,int i,int j){
//定义开始和结束
int start=i;
int end=j;
if (start>end){
return;
}
//记录基准数
int baseNumber=arr[i];
while (start!=end){
//利用end,从后往前找比基数小的
while (true){
if (end<=start || arr[end] < baseNumber){
break;
}
end--;
}
//利用start,从前往后找比基数大的
while (true){
if (end<=start || arr[start] > baseNumber){
break;
}
start++;
}
//把start和end的指向额元素互换
int temp=arr[start];
arr[start]=arr[end];
arr[end]=temp;
}
//当start和end指向同一位置的时候,表示找到了基准数的位置,让其归位
int temp=arr[i];
arr[i]=arr[start];
arr[start]=temp;
quickSort(arr,i,start-1);
quickSort(arr,start+1,j);
}
}
红色代表基准数, i从前往后找比基准数大的,j从后往前找比基准数小的。
找到后交换他们的位置,以此类推。
当i和j相等的适合这个位置就是基准数的位置 ,交换他们的位置。
此时基准数的左面都是比他小的元素,右面都是比他大的元素,但都是无序的,只需要调用递归方式让他们排序即可。