丛待排序的数列中选择一个基准值,通过遍历数列,将数列分成两个子数列:小于基准值数列、大于基准值数列,准确来说还有个子数列:等于基准值即:
public class QuickSort {
public void sort(int []arr){
doSort(arr,0,arr.length-1);
}
public void doSort(int []arr,int left,int right){
if(left >= right){
return;
}
int partitionIndex = partition(arr, left, right);
doSort(arr,left,partitionIndex-1);
doSort(arr,partitionIndex+1,right);
}
/**
* 右指针先往左移动
* @param arr
* @param left
* @param right
* @return
*/
public int partition(int []arr,int left,int right) {
int startIndex = left;
int pivot = arr[startIndex];
while (left < right) {
while (left < right && arr[right] >= pivot) {
right--;
}
while (left < right && arr[left] <= pivot) {
left++;
}
if (left < right) {
swap(arr, left, right);
}
}
swap(arr, startIndex, left);
return left;
}
private void swap(int arr[],int i,int j){
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
public static void main(String[] args) {
int arr[] = {9, 7, 1991, 27, -1, -10, 0,10,9,8,-1,27,-1, 2, 65, -100};
new QuickSort().sort(arr);
for (int i = 0; i < arr.length; i++) {
System.out.print(arr[i] + "\t");
}
}
/**
* 左指针先往右移动
* @param arr
* @param left
* @param right
* @return
*/
public int partition(int []arr,int left,int right){
int startIndex = left;
int pivot = arr[startIndex];
while (left < right) {
while (left < right && arr[left] <= pivot) {
left++;
}
while (left < right&&arr[right] >= pivot){
right --;
}
if(left < right){
swap(arr,left,right);
}
}
if(arr[left] >= pivot){
swap(arr,startIndex,left-1);
return left-1;
}
swap(arr,startIndex,left);
return left;
}