快速排序
平均时间复杂度:
/**
* 快速排序(标准版)
*
* @param arr
* @return
*/
public static void quickSort(int[] arr) {
quickSort(arr, 0, arr.length - 1);
}
public static void quickSort(int[] arr, int low, int high) {
if (low >= high) {
return;
}
// 找被比较的基数,将比基数小的数放到其前面,基数大的数放到其后面
int part = partition(arr, low, high);
// 给基数左边的数快排
quickSort(arr, low, part - 1);
// 给基数右边的数快排
quickSort(arr, part + 1, high);
}
// 找被比较的基数,将比基数小的数放到其前面,基数大的数放到其后面
public static int partition(int[] arr, int low, int high) {
// 比较的基数,默认是第一个数
int leader = arr[low];
while (low < high) {
// 当右边的数大于基数时,不改变数组,high--
while (low < high && arr[high] >= leader) {
high--;
}
// 否则 将high位置的数放到low处
arr[low] = arr[high];
// 当左边的数小于基数时,不改变数组,low++
while (low < high && arr[low] <= leader) {
low++;
}
// 否则 将low位置的数放到high处
arr[high] = arr[low];
}
arr[low] = leader;
return low;
}