快速排序¶
快速排序是对 冒泡排序 的改进,用了分治的思想。流程:
- 从序列中选择一个元素作为枢轴(pivot)。选法没有规定,随机选也可以。
- 将小于 pivot 的数移到左边,大于 pivot 的数移到右边。该过程称为一趟快速排序(或一次划分)。用双指针实现。
- 对 pivot 左右两个子序列分别执行上述过程。
分析¶
- 平均时间复杂度:\(O(n \log n)\)。常数较小,通常被认为是同数量级中最好的方法。
- 空间复杂度:\(O(\log n)\)。
- 不稳定的排序算法。
模板¶
这里始终选择第一个元素作为枢轴。如果想选择其他元素,只要选好后把它交换到第一个元素位置就行。
#define MAX_N 1000000
int N;
int nums[MAX_N];
int partition(int low, int high)
{
int pivot = nums[low];
while (low < high)
{
while (low < high && nums[high] >= pivot) high--;
nums[low] = nums[high];
while (low < high && nums[low] <= pivot) low++;
nums[high] = nums[low];
}
nums[low] = pivot;
return low;
}
void qsort(int low, int high)
{
if (low < high)
{
int mid = partition(low, high);
qsort(low, mid - 1);
qsort(mid + 1, high);
}
}
相关文章