1.特点:
(1)快速排序具有最好的平均性能
(2)时间复杂度:O(nlogn)
(3)空间复杂度:快速排序使用递归,递归使用栈,因此它的空间复杂度为O(logn)
(4)稳定性:快速排序无法保证相等的元素的相对位置不变,因此它是不稳定的排序算法
2.实现
public class Test {
public static void main(String[] args) {
int[] a = { 23, 15, 34, 15, 23, 56 };
quickSort(a, 0, a.length - 1);
for (int i = 0; i < a.length; i++) {
System.out.print(a[i] + " ");
}
}
static void quickSort(int[] a, int left, int right) {
if (left > right) {
return;
}
int i = left;
int j = right;
int temp = a[left];
while (i < j) {
// 必须是>=,否则数组有重复元素时,会陷入死循环。下同
while (a[j] >= temp && i < j) {
j--;
}
a[i] = a[j];
while (a[i] <= temp && i < j) {
i++;
}
a[j] = a[i];
}
a[i] = temp;
quickSort(a, left, i - 1);
quickSort(a, i + 1, right);
}
}
快速排序法为什么一定要从右边开始的原因?
i在大于基准数的地方停下,j在小于基准数的地方停下,如果i先走,最后停下跟基准数交换时,总是大于基准数的。