快速排序
快速排序之所以比较快,是因为相比冒泡排序,每次交换是跳跃式的。每次排序的时候设置一个基准点,将小于等于基准点的数全部放到基准点的左边,将大于等于基准点的数全部放到基准点的右边。这样在每次交换的时候就不会像冒泡排序一样只能在相邻的数之间进行交换,交换的距离就大得多了。因此总的比较和交换次数就少了,速度自然就提高了。当然在最坏的情况下,仍可能是相邻的两个数进行了交换。因此快速排序的最差时间复杂度和冒泡排序是一样的,都是 O(N 2 ),它的平均时间复杂度为 O (NlogN)。
快速排序运用了“二分法”思想:
代码如下:
// 这段代码是我参照《啊哈!算法》里的C语言代码改编的Java版本,具体讲解可以去参照《啊哈!算法》,也可以去参照其他快速排序的代码。
public static int[] quickSort(int[] arr, int left, int right) { // 刚开始时的left为0,right为arr.length-1
int i = 0, j = 0, t = 0, temp = 0;
if (left <= right) {
temp = arr[left];
i = left;
j = right;
while (i != j) {
while (arr[j] >= temp && i < j) { // 先从右往左找
j--;
}
while (arr[i] <= temp && i < j) { // 再从左往右找
i++;
}
if (i < j) {
t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
}
arr[left] = arr[i];
arr[i] = temp;
quickSort(arr, left, i - 1); // 递归处理
quickSort(arr, i + 1, right);
}
return arr;
}