快排模板(y总的
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);
}
第k小数:
第k小数,也就是排序完成后为数组中的第k个数;
void quick_sort(int a[], int l, int r) {
if (l >= r) return;
int i = l, j = r, x = a[l];
while (i < j) {
while (i < j && x <= a[j]) j--;
a[i] = a[j];
while (i < j && x >= a[i]) i++;
a[j] = a[i];
}
a[i] = x;
/*
根据快速排序的枢纽特点:
一趟排序后,枢纽左边的数小于枢纽,枢纽右面的数大于枢纽
当枢纽的位于k时,即找到了第k小的数,
当枢纽位于n-k+1时,即找到了第k大的数;
根据k的位置继续递归,当然该递归也可以改成递推。
*/
if (i == k)
return;
else if (i > k)
quick_sort(a, l, i - 1);
else if (i < k)
quick_sort(a, i + 1, r);
}
第k大数
第k大数,也就是排序完成后位于数组倒数第k个数
#include <stdio.h>
#include <stdlib.h>
int hub,k, a[1000100];
void quick_sort(int a[], int l, int r) {
if (l >= r) return;
int i = l, j = r, x = a[l];
while (i < j) {
while (i < j && x <= a[j]) j--;
a[i] = a[j];
while (i < j && x >= a[i]) i++;
a[j] = a[i];
}
a[i] = x;
if (i == hub)
return;
else if (i > hub)
quick_sort(a, l, i - 1);
else if (i < hub)
quick_sort(a, i + 1, r);
}
int main() {
int n, i, t;
scanf("%d", &t);
while (t--) {
scanf("%d %d", &n, &k);
hub=n-k+1;
for (i = 1; i <= n; i++) scanf("%d", &a[i]);
quick_sort(a, 1, n);
printf("%d\n", a[hub]);
}
return 0;
}
最小交换次数:
目前只知道这个代码可以统计最少交换次数,
但是还不能解释原因…
有大佬会的话,希望可以…ahhh
有人需要的话,可以催我一下
int sum=0;
void quick_sort(int a[], int l, int r) {
if (l >= r) return;
int i = l, j = r, x = a[l];
while (i < j) {
while (i < j && x <= a[j]) j--;
if(a[i]!=a[j]){
a[i]=a[j];
sum++;
i++;
}
while (i < j && x >= a[i]) i++;
if(a[j]!=a[i]){
a[j]=a[i];
sum++;
j--;
}
}
a[i] = x;
quick_sort(a, l, i - 1);
quick_sort(a, i + 1, r);
}
例题数据结构实验之排序二:交换排序
这个题目,对快排模板要求好像很高。
#include <bits/stdc++.h>
using namespace std;
const int N = 100020;
int a[N], b[N];
int ans1, ans2;
void quick_sort(int l, int r) {
if (l >= r) return;
int i = l, j = r, x = a[l];
while (i < j) {
while (i < j && x <= a[j]) j--;
if (a[i] != a[j]) {
a[i] = a[j];
ans2++;
i++;
}
while (i < j && x >= a[i]) i++;
if (a[j] != a[i]) {
a[j] = a[i];
ans2++;
j--;
}
}
a[i] = x;
quick_sort(l, i - 1);
quick_sort(i + 1, r);
}
int main() {
int n;
while (scanf("%d", &n) != EOF) {
ans1 = ans2 = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
b[i] = a[i];
}
quick_sort(1, n);
for (int i = 1; i < n; i++) {
for (int j = 1; j <= n - i; j++) {
if (b[j] > b[j+1]) {
ans1++;
swap(b[j],b[j+1]);
}
}
}
printf("%d %d\n", ans1, ans2);
}
return 0;
}