快速排序是目前公认最为快速和有效率的排序算法之一。快排基于分割数组的思想,首先选取一个哨兵,将数组中小于哨兵的元素归置到一边,将数组中大于等于哨兵的元素归置到另一边,然后再对两个子的部分再递归使用快排。
稳定性:快排是不稳定的,相等的元素可能会颠倒位置。
时间复杂度:O(nlog₂n)
空间复杂度:O(1)
Java的一种实现如下:
public void sort(T[] arr) {
if (arr == null || arr.length == 1) {
return;
}
sort1(arr, 0, arr.length - 1);
}
private void sort1(T[] arr, int left, int right) {
if (arr == null || arr.length == 1) {
return;
}
if (left >= right) {
return;
}
int p = partition(arr, left, right);
sort1(arr, left, p - 1);
sort1(arr, p + 1, right);
}
private int partition(T[] arr, int left, int right) {
int i = left;
int j = right;
int k = left + (right - left) / 2;
swap(arr, k, right);
T cake = arr[right];//let right empty
while (i < j) {
while (i <= right && arr[i].compareTo(cake) < 0) {//skip smaller data
i++;
}
if (i < j) {
swap(arr, i, j);
j--;//fill j with bigger and fill i with cake data and j--
}
while (j >= left && arr[j].compareTo(cake) >= 0) {//skip bigger data
j--;
}
if (i < j) {
swap(arr, i, j);
i++;//fill i with smaller data and fill j with cake and i++
}
}
return i;
}