6 条题解
-
2
menu: The first is the "sort" version. The second is the full version of quicksort.(437ms) And the third one is the optimized version.(285ms)
sort
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; vector<int> a; int x; for (int i = 1;i <= n;i++) { cin >> x; a.push_back(x); } sort(a.begin(),a.end()); for (int i = 0;i < n;i++) { cout << a[i] << " "; } return 0; }
由于管理员的要求,所以我又写了个完整版的
the full version
#include <bits/stdc++.h> using namespace std; int n; vector<int> a; void qsort(int l,int r); int main() { cin >> n; int xxx; for (int i = 1;i <= n;i++) { cin >> xxx; a.push_back(xxx); } qsort(0,n-1); for (int i = 0;i < n;i++) { cout << a[i] << " "; } return 0; } void qsort(int l,int r) { int x = a[(l+r)/2]; int i = l,j = r; while (i <= j) { while(a[i] < x) { i++; } while(a[j] > x) { j--; } if (i<=j) { swap(a[i],a[j]); i++; j--; } } if (l < j) { qsort(l,j); } if (r > i) { qsort(i,r); } return; }
但是我发现需要437ms,于是加了一点点优化
the optimized version
#include <bits/stdc++.h> using namespace std; int n; vector<int> a; void qsort(int l,int r); int main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);//优化 cin >> n; int xxx; for (int i = 1;i <= n;i++) { cin >> xxx; a.push_back(xxx); } qsort(0,n-1); for (int i = 0;i < n;i++) { cout << a[i] << " "; } return 0; } void qsort(int l,int r) { int x = a[(l+r)/2]; int i = l,j = r; while (i <= j) { while(a[i] < x) { i++; } while(a[j] > x) { j--; } if (i<=j) { swap(a[i],a[j]); i++; j--; } } if (l < j) { qsort(l,j); } if (r > i) { qsort(i,r); } return; }
这样时间好了一点,有心情的可继续优化
题解制作困难,请点赞支持一下!!!
-
1
定义
快速排序(英语:Quicksort),又称分区交换排序(英语:partition-exchange sort),简称「快排」,是一种被广泛运用的排序算法。
基本原理与实现
过程
快速排序的工作原理是通过
分治
的方式来将一个数组排序。快速排序分为三个过程:
- 将数列划分为两部分(要求保证相对大小关系);
- 递归到两个子序列中分别进行快速排序;
- 不用合并,因为此时数列已经完全有序。
和归并排序不同,第一步并不是直接分成前后两个序列,而是在分的过程中要保证相对大小关系。具体来说,第一步要是要把数列分成两个部分,然后保证前一个子数列中的数都小于后一个子数列中的数。为了保证平均时间复杂度,一般是随机选择一个数 来当做两个子数列的分界。
之后,维护一前一后两个指针 和 ,依次考虑当前的数是否放在了应该放的位置(前还是后)。如果当前的数没放对,比如说如果后面的指针 遇到了一个比 小的数,那么可以交换 和 位置上的数,再把 向后移一位。当前的数的位置全放对后,再移动指针继续处理,直到两个指针相遇。
其实,快速排序没有指定应如何具体实现第一步,不论是选择 的过程还是划分的过程,都有不止一种实现方法。
第三步中的序列已经分别有序且第一个序列中的数都小于第二个数,所以直接拼接起来就好了。
ps:想想办法实现一下快速排序,不要直接用sort
-
-1
做出来啦!!!
#include <bits/stdc++.h> #define ll long long #define re register int using namespace std; ll n; int main() { cin >> n; vector<ll> vec; for (re i = 1; i <= n; i++) { ll x; cin >> x; vec.push_back(x); } sort(vec.begin(), vec.end()); for (re i = 0; i < n; i++) cout << vec[i] << " "; return 0; }
- 1
信息
- ID
- 487
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 499
- 已通过
- 201
- 上传者