2022春季 哈工大 硕士算法设计与分析 实验四 快速排序
作者:互联网
#pragma comment(linker,"/STACK:1024000000,1024000000") #include <bits/stdc++.h> using namespace std; const int maxn = 1e6; int Rand_Partition(vector<int> &A, int &p,int &r) { // 随机生成锚点下标 int i = rand() % (r - p) + p; swap(A[r], A[i]); int x = A[r]; i = p - 1; for(int j = p; j < r; j++) { // A[j] < x时交换到前面,保证i + 1前面的都是小于x的 if(A[j] < x) { i++; swap(A[i], A[j]); } } // 将x放到i + 1的位置 swap(A[i + 1], A[r]); return i + 1; } // 只能保证小于的在左边,右边的为大于和等于的乱序 // 以q为划分边界,重复的元素也会处理 void QuickSort1(vector<int> &A, int p, int r) { if(p < r) { int q = Rand_Partition(A, p, r); QuickSort1(A, p, q - 1); QuickSort1(A, q + 1, r); } } // 算法保证了与锚点相同的在中间,小于的在左边,大于的在右边 void QuickSort2(vector<int>& A, int l, int r) { if(l >= r) return; int p = l, q = r; int i = rand() % (r - l) + l; int x = A[i]; i = l; // 小于q,因为q后边的都是大于x的 while(i <= q) { if(A[i] == x) { i++; continue; } else if(A[i] < x) swap(A[i++], A[p++]); // 因为前面的元素已经遍历过了,位置p之前一定是==x的元素,因此直接i++即可 // 而后边换过来的元素并不知道其大小,因此i不变 else swap(A[i], A[q--]); } // 注意划分区域,中间相同的不再处理 QuickSort2(A, l, p - 1); QuickSort2(A, q + 1, r); } void DataGenerate(vector<int> &A, int k) { A.clear(); srand(time(0)); int m = 1e5 * k; for(int i = 0; i < maxn; i++) { if(i < m) A.push_back(7); else A.push_back(i); } random_shuffle(A.begin(), A.end()); } vector<int> A; int main() { int n; for(int i = 0; i < 11; i++) { DataGenerate(A, i); clock_t startTime, endTime; startTime = clock(); // QuickSort1(A, 0, A.size() - 1); // sort(A.begin(), A.end()); QuickSort2(A, 0, A.size() - 1); endTime = clock(); cout << "the "<< i << "st sort which has "<< 1e5 * i << " repeat nums needs " << endTime - startTime << " ms" << endl; } return 0; }
标签:vector,clock,int,++,哈工大,QuickSort1,swap,2022,排序 来源: https://www.cnblogs.com/WTSRUVF/p/16350522.html