快速排序
模板
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| int n; int a[N];
void qs(int l,int r){ if(l>=r) return; int x=a[(l+r)/2],i=l-1,j=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]); } qs(l,j); qs(j+1,r); }
qs(0,n-1);
|
例题
【1.基础算法-模板】1.快速排序 (模板)_快速排序算法模板-CSDN博客
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
| #include<bits/stdc++.h> using namespace std;
const int N=1e5+5; int n; int a[N];
void qs(int l,int r){ if(l>=r) return; int x=a[(l+r)/2],i=l-1,j=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]); } qs(l,j); qs(j+1,r); }
void work(){ cin>>n; for(int i=0;i<n;i++) cin>>a[i]; qs(0,n-1); for(int i=0;i<n;i++) cout<<a[i]<<" "; }
int main(){ work(); return 0; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| #include <bits/stdc++.h> using namespace std;
int n, k; const int N = 1e5 + 5; int a[N];
int find_k(int l, int r, int k) { if (l >= r) return a[l]; int x = a[l + (r - l) / 2], i = l - 1, j = 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]); }
int len = j - l + 1; if (len >= k) return find_k(l, j, k); else return find_k(j + 1, r, k - len); }
void work() { cin >> n >> k; for (int i = 0; i < n; i++) cin >> a[i]; int find = find_k(0, n - 1, k); cout << find << endl; }
int main() { work(); return 0; }
|