【思路】快排的关键是每次排序找到一个支点,然后快排一次的结果是:支点左侧值全部小于支点值,支点右侧值全部大于支点值。代码的思路是:每次排序将arr[low]作为支点值pivotkey,支点不动,分别头尾设置指针i、j,arr[j]>=pivotkey,j支点左移,不满足的时找到小于pivotkey的值(不满足条件的值arr[j]);arr[i]<=pivotkey,i支点右移,不满足的时候,找到大于pivotkey的值(不满足的值arr[i]);交换arr[i]和arr[j],继续移动指针,直到i、j相遇,此时,交换arr[i]和arr[low](支点值pivotkey),一次循环结束。
对数组支点左侧和右侧分别重复上述循环。
public class quicksort {
public int Partition(int[] arr,int low,int high) {
int i = low;
int j = high;
int pivotkey = arr[i];
while (i < j) {
while (i < j && arr[j] >= pivotkey) {
j--;
}
while (i < j && arr[i] <= pivotkey) {
i++;
}
if (i < j) {
swap(arr,i,j);
}
}
if(i==j){
swap(arr,i,low);
}
return i;
}
public static void swap ( int[] a, int i, int j){
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
public void QuickSort1 ( int[] arr, int low, int high){
int mid;
if (low < high) {
mid = Partition(arr, low, high);
QuickSort1(arr, low, mid - 1);
QuickSort1(arr, mid + 1, high);
}
}
public static void main (String args[]){
quicksort test = new quicksort();
int[] arr = {49, 39, 65, 97, 76, 13, 27, 69};
test.QuickSort1(arr,0,7);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
一种写在一个方法里的写法:
public void QuickSort2(int[] arr,int low,int high){
if(arr.length<=0)return;
if(low>=high)return;
int i=low;
int j=high;
int pivotkey=arr[low];
while(i<j){
while(i<j && arr[j]>=pivotkey){j--;}
while(i<j && arr[i]<=pivotkey) {i++;}
if(i<j){
int tmp=arr[i];
arr[i]=arr[j];
arr[j]=tmp;
}
}
if(i==j){
arr[low]=arr[i];
arr[i]=pivotkey;
}
QuickSort2(arr,low,i-1);
QuickSort2(arr,i+1,high);
}