/*升序快排(随机数版)*/
int Partition(int *arr, int l, int r) {
srand(int(time(0)));
int p = rand() % (r - l + 1) + l;
swap(arr[p], arr[r]);//以最后一个元素为基准(随机选取一个数作为最后一个数)
int x = arr[r];
int i = l, j = r;
while (i < j) {
/*如果以第一个元素为基准仅需交换两个while循环执行顺序*/
while (arr[i] <= x && i < j) ++i; //最左边大于x的数
arr[j] = arr[i]; //放右边
while (arr[j] >= x && i < j) --j;//最右边小于x的数
arr[i] = arr[j]; //放左边
}
arr[i] = x; //i即为中点
return i;
}
/*辅助函数*/
void quick_sort(int *arr, int l, int r) {
if (l < r) {
int p = Partition(arr, l, r);
quick_sort(arr, l, p - 1);
quick_sort(arr, p + 1, r);
}
}
/*降序快排(随机数版)*/
int Partition(int *arr, int l, int r) {
srand(int(time(0)));
int p = rand() % (r - l + 1) + l;
swap(arr[p], arr[r]);//以最后一个元素为基准(随机选取一个数作为最后一个数)
int x = arr[r];
int i = l, j = r;
while (i < j) {
/*如果以第一个元素为基准仅需交换两个while循环执行顺序*/
while (arr[i]>= x && i < j) ++i; //最左边小于x的数
arr[j] = arr[i]; //放右边
while (arr[j] <= x && i < j) --j;//最右边大于x的数
arr[i] = arr[j]; //放左边
}
arr[i] = x; //i即为中点
return i;
}
/*辅助函数*/
void quick_sort(int *arr, int l, int r) {
if (l < r) {
int p = Partition(arr, l, r);
quick_sort(arr, l, p - 1);
quick_sort(arr, p + 1, r);
}
}
/*
第K大数(随机数版)
*/
int Partition(int *arr, int l, int r, int k) {
srand(int(time(0)));
int p = rand() % (r - l + 1) + l;
swap(arr[p], arr[r]);//以第一个元素为基准(随机选取一个数作为最后一个数)
int x = arr[r];
int i = l, j = r;
while (i < j) {
while (arr[i] >= x && i < j) ++i; //最左边小于x的数
arr[j] = arr[i]; //放右边
while (arr[j] <= x && i < j) --j;//最右边大于x的数
arr[i] = arr[j]; //放左边
}
arr[i] = x; //i即为中点
if (i - l + 1 == k) return arr[i]; //第K大数
/*第K大数在i的右边*/
else if (i - l + 1 < k) return Partition(arr, i + 1, r, k - (i - l + 1));
/*第K大数在i的左边*/
else return Partition(arr, l, i - 1, k);
}
/*
/*第K大数(以第一个元素为基准)*/
int Partition(int *arr, int l, int r, int k) {
srand(int(time(0)));
int p = rand() % (r - l + 1) + l;
swap(arr[p], arr[l]);//以最后一个元素为基准(随机选取一个数作为最后一个数)
int x = arr[l];
int i = l, j = r;
while (i < j) {
/*如果以第一个元素为基准仅需交换两个while循环执行顺序*/
while (arr[j] <= x && i < j) --j;//最右边大于x的数
arr[i] = arr[j]; //放左边
while (arr[i] >= x && i < j) ++i; //最左边小于x的数
arr[j] = arr[i]; //放右边
}
arr[i] = x; //i即为中点
if (i - l + 1 == k) return arr[i];
else if (i - l + 1 < k) return Partition(arr, i + 1, r, k - (i - l + 1));
else return Partition(arr, l, i - 1, k);
}
*/
/*第K小数,以第一个元素为基准*/
int Partition(int *arr, int l, int r, int k) {
srand(int(time(0)));
int p = rand() % (r - l + 1) + l;
swap(arr[p], arr[l]);//以第一个元素为基准(随机选取一个数作为最后一个数)
int x = arr[l];
int i = l, j = r;
while (i < j) {
/*如果以最后一个元素为基准仅需交换两个while循环执行顺序*/
while (arr[j] >= x && i < j) --j;//最右边小于x的数
arr[i] = arr[j]; //放左边
while (arr[i] <= x && i < j) ++i; //最左边大于x的数
arr[j] = arr[i]; //放右边
}
arr[i] = x; //i即为中点
if (i - l + 1 == k) return arr[i];
else if (i - l + 1 < k) return Partition(arr, i + 1, r, k - (i - l + 1));
else return Partition(arr, l, i - 1, k);
}