时间复杂度:o(nlogn)
package com.test.sort;
public class TestQuickSort {
public static void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
public static int partition(int[] array, int lo, int hi) {
int mid = (hi + lo) / 2;
if (array[mid] > array[hi])
swap(array[mid], array[hi]);
if (array[lo] > array[mid])
swap(array[lo], array[hi]);
if (array[lo] > array[hi])
swap(array[lo], array[hi]);
int key = array[lo];
while (lo < hi) {
while (lo < hi && array[hi] >= key) {
hi--;
}
array[lo] = array[hi];
while (lo < hi && array[lo] <= key) {
lo++;
}
array[hi] = array[lo];
}
array[lo] = key;
return lo;
}
public static void sort(int[] array, int lo, int hi) {
if (lo > hi)
return ;
int index = partition(array, lo, hi);
sort(array, lo, index - 1);
sort(array, index + 1, hi);
}
public static void main(String[] args) {
int[] array = {3, 2, 1, 5, 1};
sort(array, 0, array.length - 1);
System.out.println(Arrays.toString(array));
}
}
时间复杂度:分为两部分,第一部分是每个数都与基准值比较一次,即o(n)。第二部分是每次比较的过程中,将n个数分成两堆, 直到每堆的元素个数为1,即分两堆的次数,logn。两部分相乘,即o(nlogn)。
(额外讲解下,第一次分堆,分成2堆;第二次分堆,分成4堆;依次类推,直到每堆的元素个数为1。经过计算一共分了logn次)