快速排序思路(挖坑法):
- 选取数组最左边或最右边值作为key值,指定数组第一个元素为left,倒数第二个为right。
- 比较 array[left] 与key,若是array[left] > key,则left指向该元素,若array[left] < key,则使left++,直至找出比left大的值。
- 比较 array[right] 与key,若是 array[right] < key,则right指向该元素,若 array[right] > key,则使right++,直至找出比right小的值。
- 交换 array[left] 与 array[right] 的值,使left,right各自++。
- 当left >= right时,交换 array[left] 与 key 的值。
- 这样一次完成后,最大值array[left] 被放在了最后一个位置,而key值的位置就是排序完成后所在的位置,问题分为对前后两个数组进行快速排序,递归结束条件是当数组只有一个元素时退出。
下图是完成一趟排序的导图:
代码如下:
public class Test{
public static void main(String[] args){
int[] array ={4,1,7,6,9,2,8,0,3,5};
int i=0;
for(i=0;i<array.length;i++){
System.out.print(i+" ");
}
quickSort(array,0,array.length-1);
System.out.println();
for(i=0;i<array.length;i++){
System.out.print(i+" ");
}
}
public static int change (int[] array,int left,int right){
int key = array[right-1];
int tmp=0;
while(left < right){
while(array[left] < key){
left++;
}
while(array[right-1] > key){
right--;
}
tmp = array[left];
array[left] = array[right];
array[right] = tmp;
}
tmp = array[left];
array[left] = key;
key = tmp;
return left;
}
public static void quickSort(int[] array,int left,int right){
if(left < right){
int mid = change(array,left,right);
quickSort(array,left,mid-1);
quickSort(array,mid+1,right);
}
}
}