快速排序+归并排序
#include <iostream>
using namespace std;
const int N = 1e6 + 10;
int n;
int A[N];
int temp[N];
void quick_sort(int A[], int l, int r){
if(l >= r) return;
int x = A[l + r >> 1] , 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]);
}
quick_sort(A,l,j);
quick_sort(A,j + 1, r);
}
void merge_sort(int A[], int l , int r){
if(l >= r) return;
int mid = l + r >> 1;
merge_sort(A, l, mid);
merge_sort(A, mid + 1 , r);
int k = 0 , i = l , j = mid + 1;
while(i <= mid && j <= r){
if(A[i] <= A[j]){
temp[k ++] = A[i ++];
}else{
temp[k ++] = A[j ++];
}
}
while(i <= mid) temp[k ++] = A[i ++];
while(j <= r) temp[k ++] = A[j ++];
for(int i = l,j = 0; i <= r; i ++, j ++) A[i] = temp[j];
}
int main(){
cin >> n;
for(int i = 0; i < n; i ++){
scanf("%d",&A[i]);
}
merge_sort(A, 0, n - 1);
for(int i = 0; i < n; i ++){
printf("%d ",A[i]);
}
return 0;
}
快速选择
#include <iostream>
using namespace std;
const int N = 1e5 + 19;
int n, k, a[N];
int quick_sort(int a[], int l, int r, int k){
if(l == r) return a[l];
int i = l - 1, j = r + 1, x = a[l + r >> 1];
while(i < j){
while(a[++ i] < x);
while(a[-- j] > x);
if(i < j) swap(a[i], a[j]);
}
int cl = j - l + 1;
if(k <= cl) return quick_sort(a, l, j, k);
else return quick_sort(a, j + 1, r, k - cl);
}
int main(){
cin >> n >> k;
for(int i = 0; i < n; i ++) cin >> a[i];
cout << quick_sort(a, 0, n - 1, k);
return 0;
}