/**
* 快速排序
* 算法思想:把选定主元,然后把小于主元的元素放到主元前面,把大于主元的元素放到主元后面,
* 然后分别对前面和后面的元素递归,再次选定主元,继续操作,递归求解,算法复杂度跟主元的选取有关,
* 算法复杂度为:平均时间:O(nlogn)
*
*/
public class QuickSort {
/**
* 快速排序入口
* 传入要排序的数组,然后交给它的重载方法,开始快速排序
* @param arr
*/
public static void quickSort(int[] arr){
quickSort(arr,0,arr.length - 1);
}
/**
* 真正的快速排序算法,
* 使用递归的方式实现
* @param arr
* @param first
* @param last
*/
private static void quickSort(int[] arr, int first, int last) {
if(last > first){
//通过partition函数为主要的算法体
int pivotIndex = partition(arr,first,last);
//主元左边开始递归调用
quickSort(arr,first,pivotIndex - 1);
//主元右边开始递归调用
quickSort(arr,pivotIndex + 1,last);
}
}
/**
* 算法核心代码,
* 用于把大于主元的元素放到主元的右边,小于主元的元素放到左边,要多注意边界条件
* @param arr
* @param first
* @param last
* @return
*/
private static int partition(int[] arr, int first, int last) {
int pivot = arr[first];
int low = first + 1;
int high = last;
while(high > low){
while(low <= high && arr[low] <= pivot){
low++;
}
while(low <= high && arr[high] > pivot){
high--;
}
if (low < high){
int temp = arr[high];
arr[high] = arr[low];
arr[low] = temp;
}
}
while(high > first && arr[high] >pivot){
high--;
}
if(pivot > arr[high]){
arr[first] = arr[high];
arr[high] = pivot;
return high;
}else{
return first;
}
}
}