本文共 2101 字,大约阅读时间需要 7 分钟。
public static void main(String[] args) { int[] arrs = {7,12,3,5,8,15,9,6,6,6,6,19,-2}; quickSort(arrs,0,arrs.length - 1); System.out.println(Arrays.toString(arrs));}private static void quickSort(int[] arrs, int l, int r) { if (l < r){ //index就算返回回来的分割点 int index = getindex(arrs,l,r); //有了分割点就知道怎么分割两段数据序列了 quickSort(arrs,l,index-1); quickSort(arrs,index+1,r); }} private static int getindex(int[] arrs, int l, int r) { int base = arrs[l]; //取第一个值做base值 //保证不判断过头 while (l < r){ //arrs[r] > base 只要比base大的值就继续找,找到比base小的或者相等的 //就不满足条件就可以确定值的下标了 while (l < r && arrs[r] >= base){ //进来就代表比base大 r --; } //到这就算找到<=base的值了,然后赋值给left arrs[l] = arrs[r]; //开始寻找比base大的值,流程跟上一个while一样 while (l < r && arrs[l] <= base){ l ++; } //到这就算找到>=base的值了,然后赋值个right arrs[r] = arrs[l]; } //然后将base值赋值给right arrs[r] = base; //返回这个分割点,即right return r;}
int partition(int a[], int lo, int hi) { swap(a[lo],a[lo+rand()%(hi-lo+1)]);//随机交换,避免最坏情况的发生 int pivot = a[lo]; int mi=lo; for(int i=lo+1;i<=hi;i++)//自左向右考察每个a[i] if(a[i]a[low..m–1], pivot, a[m+1..high] quickSort(a, low, m-1); // 递归地将左子阵列排序 // a[m] = pivot 在分区后就被排序好了 quickSort(a, m+1, high); // 然后将右子阵列排序 }}
转载地址:http://ravta.baihongyu.com/