概述
- 通俗易懂版:有一个数组,数组的第一位设为基准为,所有比基准位小的都置于左侧(这里默认升序),所有比基准位大的置于右侧,此时原来的基准为现在就在数组中间,这样第一轮排序完成,这时将基准位的两侧都当初新的数组,重复执行上面的操作,每一个新数组都会分成两个新数组,一直执行下去,直到只剩一位,不能在分时,代表,排序完成,return!
- 那么怎么来完成以上要求呢?现在来分布执行一下步骤:
- 先定义个一个变量tmp,保存一下基准位
- 现在需要一个while循环,从数组的最后一位开始跟基准位比较,如果比基准小,那么我们将改值传递至基准位,此时该whie循环结束
- 现在还需要一个while循环,将从数组的第二位开始与基准为比较,如果比基准位大,将值传递至上一个循环结束的位置,此时该循环结束
- 现在我们要重复上面两步的操作,直到,两个循环的下标相等,即结束
- 因为两个下标已相等,此时就将基准位传入该位置,此时左都比基准位小,右侧都比基准大,那么该轮循环确定了基准位应该所在的位置
- 接下来将左右两次当成新数组,继续执行以上步骤,这里就用到了递归调用
实现方法
import java.util.Arrays;
import java.util.Random;
public class QuickSort2 {
public static void quick(int[] a,int start,int end) {
int i=start,j=end;
if (i>=j)return;
int tmp=a[start];
while (i<j){
while (a[j]>=tmp&&i<j) j--;
a[i]=a[j];
while (a[i]<=tmp&&i<j) i++;
a[j]=a[i];
}
a[i]=tmp;
quick(a,start,i-1);
quick(a,i+1,end);
}
public static int[] randomArrays(int length){
int[] a=new int[length];
for (int i = 0; i < a.length; i++) {
Random r=new Random();
a[i]=r.nextInt(100);
}
return a;
}
public static void main(String[] args) {
int[] a=randomArrays(10);
System.out.println(Arrays.toString(a));
quick(a,0,a.length-1);
System.out.println(Arrays.toString(a));
}
}