快速排序的基本思想: 采用经典的分治策略,选择数组中某个元素作为基准数,通过一趟排序将数组分为独立的两个子数组,一个子数组中所有元素值都比基准数小,另一个子数组中所有元素值都比基准数大。然后再按照同样的方式递归的对两个子数组分别进行快速排序,以达到整个数组有序。
代码实现
public static void quickSort(int[] array, int start, int end) {
// 开始索引比最后的索引大或者相等,就没有必要继续了。
if (start >= end) {
return;
}
int i = start;
int j = end;
// 选定一个基准值,这个值可以是整个数组中任何一个数据。
int baseNumber = array[i];
while (i < j) {
// 从右往左找一个比基准值小的数,准备交换。
while (i < j && array[j] > baseNumber) {
j--;
}
// 从左往右找一个比基准值大的数,准备交换。
while (i < j && array[i] < baseNumber) {
i++;
}
// 交换这两个数,然后继续,因为一次遍历可以存在多次交换。
if (i < j) {
int temp =array[i];
array[i] = array[j];
array[j] = temp;
i++;
j--;
}
}
quickSort(array, start, i - 1); /* 递归调用 */
quickSort(array, i + 1, end); /* 递归调用 */
}
快速排序也是利用了分治的处理方式,就是将复杂的问题分成一个一个的小块进行逐步处理。 快速排序法平均时间复杂度是O(nlgn)。最差是O(n2),这种情况对应的是,选取的基准值在最左边,且,使用了从小到大的排序,这就会将快速排序变成冒泡排序。
O(nlgn)的由来,外层的while (i < j) 是n,内部由于使用了分治,复杂度是O(lgn),所以整体复杂度变成了O(nlgn)