看别人视频自己总结的步骤,仅供自己娱乐玩耍
大概思路:
1.找出数组支点 办法一 随机找一个数(不怎么好 万一你找到最大或最小的呢) 办法二 取开头结尾中间三个数中中间大的数作为支点(本人采用这个办法)
2.将支点与数组的倒数第二个数交换
3.从数组左边第二个数开始找比支点小的数,从数组右边倒数第三个数开始找比支点大的数,如果找到了,并且左边的角标比右边的角标小就将这两个数交换位置.,如果左边的角标大于等于右边的角标将停止查找,再将支点与左边角标所代表的数交换位置.,此时就形成的支点比左边的数大,比右边的数小(分治法).此时一个数的位置就已经确定了.接下来的动作就是递归以上的操作..
code:
public class Quick extends BaseSort {
public static void sortPivot(int[] arr,int first,int mid,int last){
sortSwap(arr,first,mid);
sortSwap(arr,mid,last);
sortSwap(arr,first,mid);
}
public static void sortSwap(int[] arr,int before,int after){
if(arr[before]>arr[after]){
swap(arr, before, after);
}
}
public static void swap(int[] arr, int before, int after) {
int temp;
temp = arr[before];
arr[before] = arr[after];
arr[after] = temp;
}
public static int sortPartition(int[] arr,int first,int last){
int mid = (last + first)/2;
sortPivot(arr, first, mid, last);
swap(arr, mid, last-1);//将支点与倒数第二个数交换
int pivotIndex = last-1;
int pivot = arr[pivotIndex];//支点的值
int firstLeft = first+1;
int lastRight = last-2;
boolean done =false;
while(!done){
while(arr[firstLeft]<pivot)
firstLeft++;
while(pivot<arr[lastRight])
lastRight--;
if(firstLeft<lastRight){
swap(arr,firstLeft,lastRight);
firstLeft++;
lastRight--;
}else{
done = true;
}
}
swap(arr,pivotIndex,firstLeft);
pivotIndex = firstLeft;
return pivotIndex;
}
public static int[] sort(int[] arr,int first,int last){
if(last - first +1 < 4){
int mid = (first+last)/2;
sortPivot(arr,first,mid,last);
}else{
int pivotIndext = sortPartition(arr, first, last);
sort(arr,first,pivotIndext-1);
sort(arr,pivotIndext+1,last);
}
return arr;
}
public static void main(String[] args) {
int[] is = sort(array,0,array.length-1);
}
参考视频地址 http://v.youku.com/v_show/id_XMzgzMDA0Mjc2.html