快速排序
定义
快速排序(Quicksort),又称分区交换排序(partition-exchange sort),简称「快排」,是一种被广泛运用的排序算法。
过程
快速排序的工作原理是通过 分治 的方式来将一个数组排序。
快速排序分为三个过程:
1.将数列划分为两部分(要求保证相对大小关系);
2.递归到两个子序列中分别进行快速排序;
3.不用合并,因为此时数列已经完全有序。
和归并排序不同,第一步并不是直接分成前后两个序列,而是在分的过程中要保证相对大小关系。具体来说,第一步要是要把数列分成两个部分,然后保证前一个子数列中的数都小于后一个子数列中的数。为了保证平均时间复杂度,一般是随机选择一个数 m 来当做两个子数列的分界。
之后,维护一前一后两个指针 p 和 q,依次考虑当前的数是否放在了应该放的位置(前还是后)。如果当前的数没放对,比如说如果后面的指针 q 遇到了一个比 m 小的数,那么可以交换 p 和 q 位置上的数,再把 p 向后移一位。当前的数的位置全放对后,再移动指针继续处理,直到两个指针相遇。
其实,快速排序没有指定应如何具体实现第一步,不论是选择 m 的过程还是划分的过程,都有不止一种实现方法。
第三步中的序列已经分别有序且第一个序列中的数都小于第二个数,所以直接拼接起来就好了。
模板
| void quick_sort(int q[], int l, int r) |
| { |
| if (l >= r) return; |
| |
| int i = l - 1, j = r + 1, x = q[l + r >> 1]; |
| while (i < j) |
| { |
| do i ++ ; while (q[i] < x); |
| do j -- ; while (q[j] > x); |
| if (i < j) swap(q[i], q[j]); |
| } |
| quick_sort(q, l, j), quick_sort(q, j + 1, r); |
| } |
代码实现
| |
| using namespace std; |
| const int N = 1000010; |
| |
| int q[N]; |
| |
| void quick_sort(int q[], int l, int r) |
| { |
| if (l >= r) return; |
| |
| int i = l - 1, j = r + 1, x = q[l + r >> 1]; |
| while (i < j) |
| { |
| do i ++ ; while (q[i] < x); |
| do j -- ; while (q[j] > x); |
| if (i < j) swap(q[i], q[j]); |
| } |
| |
| quick_sort(q, l, j); |
| quick_sort(q, j + 1, r); |
| } |
| |
| int main() |
| { |
| int n; |
| scanf("%d", &n); |
| |
| for (int i = 0; i < n; i ++ ) scanf("%d", &q[i]); |
| |
| quick_sort(q, 0, n - 1); |
| |
| for (int i = 0; i < n; i ++ ) printf("%d ", q[i]); |
| |
| return 0; |
| } |
求第k小数(建议背这个模板)
| #include <bits/stdc++.h> |
| using namespace std; |
| int a[1000010]; |
| void quick_sort(int l,int r) |
| { |
| if(l >= r) return; |
| |
| int i = l - 1,j = r + 1,x = a[l + r >> 1]; |
| while(i < j) |
| { |
| do i++; while(a[i] < x); |
| do j--; while(a[j] > x); |
| if(i < j) swap(a[i],a[j]); |
| } |
| |
| quick_sort(l,j); |
| quick_sort(j + 1,r); |
| } |
| int main() |
| { |
| int n,k; |
| cin >> n >> k; |
| for(int i = 1;i <= n;i++) cin >> a[i]; |
| quick_sort(1,n); |
| cout << a[k]; |
| return 0; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】