核心思想:定义一个参考值,将比参考值小的放在参考值左边,比参考值大的放右边。这样,就找出了参考值在数组中的位置。
代码实现重点:
- 方法传入三个参数,原数组,左边界low,右边界high。
- 定义两个指针指向左右边界,以便来遍历数组;再定义一个临时变量记录参考值。
- 当左指针小于右指针时,先向左移动右指针(?),找到一个比参考值小的元素,然后覆盖左指针指向的元素(?),左指针移动一位;再向右移动左指针,指向一个比参考值大的元素,覆盖右指针指向的元素,右指针移动一位。
- 当退出while循环后,左右指针指向数组中的同一个位置,将参考值放在该位置上,即找到了参考值在数组中从小到大顺序排序的位置。
- 在参考值的左右两边进行递归排序。
问:为什么需要先移动右指针?
因为,首先保存的是左边界上的值,由于左边界上的值保存了一份,所以可以放心首先覆盖。如果第一次覆盖的是右边的值,那数组中就会直接少一个元素。如果保存的是右边界的值,那么就可以先移动左指针。
代码实现如下:
import java.util.Arrays;
public class QuickSort {
private static void quickSort(int[] arr){
if(arr==null||arr.length==0) return;
quickSort(arr,0,arr.length-1);
}
private static void quickSort(int[] arr,int low,int high){
if(low>=high){
return;
}
int i=low,j=high,index=arr[low];
while(i<j){
while(i<j&&arr[j]>=index){
j--;
}
if(i<j){
arr[i]=arr[j];
i++;
}
while(i<j&&arr[i]<index){
i++;
}
if(i<j){
arr[j]=arr[i];
j--;
}
}
arr[i]=index;
quickSort(arr,low,i-1);
quickSort(arr,i+1,high);
}
public static void main(String args[]){
int[] arr=new int[]{9,8,7,6,5,4,3,2,1};
int[] temp=new int[arr.length];
quickSort(arr);
System.out.println(Arrays.toString(arr));
}
}
如果保存的是右边界的值,则先移动左指针。
import java.util.Arrays;
public class QuickSort {
private static void quickSort(int[] arr){
if(arr==null||arr.length==0) return;
quickSort(arr,0,arr.length-1);
}
private static void quickSort(int[] arr,int low,int high){
if(low>=high){
return;
}
int i=low,j=high,index=arr[high];
while(i<j){
while(i<j&&arr[i]<index){
i++;
}
if(i<j){
arr[j]=arr[i];
j--;
}
while(i<j&&arr[j]>=index){
j--;
}
if(i<j){
arr[i]=arr[j];
i++;
}
}
arr[i]=index;
quickSort(arr,low,i-1);
quickSort(arr,i+1,high);
}
public static void main(String args[]){
int[] arr=new int[]{9,8,7,6,5,4,3,2,1};
int[] temp=new int[arr.length];
quickSort(arr);
System.out.println(Arrays.toString(arr));
}
}