Patty_Q @ 2023-01-07 17:45:50
#include <bits/stdc++.h>
using namespace std;
const int N = 5000100;
int n, k, a[N];
void quicksort(int l, int r, int k)
{
if(l >= r) return;
swap(a[l], a[l + rand() % (r - l + 1)]);
int x = a[l];//取值
int i = l, j = r;//取i,j指针
while(i < j)//只要i和j没有相遇
{
while(i < j && a[j] > x) j--;//j从右往做找小于等于x的数
if(i < j) a[i++] = a[j];
while(i < j && a[i] < x) i++;//i从左往右找大于等于x的数
if(i < j) a[j--] = a[i];
}
a[i] = x;//最后把x归位
if(i == k) {
printf("%d", a[i]);
return;
}
if(k < i) quicksort(l, i - 1, k);//递归右区间
else if(k > i) quicksort(i + 1, r, k);//递归左区间
}
int main()
{
scanf("%d%d", &n, &k);
k++;
for(int i = 1; i <= n; i ++) scanf("%d", &a[i]);
if(n == 1) cout << a[1];
else{
quicksort(1, n, k);
}
return 0;
}
by mooktian @ 2023-02-03 21:23:15
while(i < j && a[j] > x) j--;//j从右往做找小于等于x的数
if(i < j) a[i++] = a[j];
while(i < j && a[i] < x) i++;//i从左往右找大于等于x的数
if(i < j) a[j--] = a[i];
你这个写法看得我很迷惑,看不懂。 好像应该是这样的
while(a[i]<flag) i++;
while(a[j]>flag) j--;
if(i<=j) {
tmp=a[i];a[i]=a[j];a[j]=tmp;
i++;j--;
你这样写能正常交换么?
@GMU_QinYuCheng
by Patty_Q @ 2023-02-05 22:14:09
@mooktian 问题找到了,是遇到区间长度为1的时候,我直接return了。