快速排序算法思想
快速排序采用了分治的思想,其时间复杂度为
O
(
n
l
o
g
2
n
)
O(nlog_2n)
O(nlog2n).
快速排序是一种不稳定的排序。
基本步骤
- 找一个基准(pivot)。一般是第一个,但是更合理的是数组中的一个随机元素。
- 重新排序数组。将比基准小的放在基准左侧,将比基准大的放在基准右侧。排序完成后,该基准处于序列的中间,称为分区(partition)。
- 接下来,递归地对分区两边的部分进行上述操作,最终完成排序。
代码
public static void quickSort(int[] nums, int start, int end) {
// 当 start = end时,只有一个元素不需要排序
if (start < end) {
int base = nums[start];
int low = start;
int high = end;
// 循环找比标准数大的数和比标准数小的数
while (low < high) {
//右边的数字比标准数大
while (low < high && nums[high] >= base) {
high--;
}
//上述循环结束后,high的位置一定比base小,将这个数放在low的位置。
nums[low] = nums[high];
//左边的数比标准数小
while (low < high && nums[low] <= base) {
low++;
}
// 上述循环结束后,low的位置一定比base大,将这个数放在high的位置。
nums[high] = nums[low];
}
nums[low] = base;
quickSort(nums,start,low-1);
quickSort(nums,low+1,end);
}
}
算法模拟过程像是拆东墙补西墙的感觉,首先使用开头的数作为基准,也就是low
位置的数,然后从右侧找到第一个比pivot
小的数,其index
为high
,将nums[high]
放在nums[low]
的位置,然后再从左侧找到第一个比pivot
大的数,其index
为low
,将nums[low]
放在nums[high]
的位置。依次这样循环,直到 low
和high
相等。 最后将base(pivot)
放在low/high
位置,就完成了一次分区。接着对左右部分分别递归排序即可。