Hauauah @ 2024-01-22 01:59:38
#include<bits/stdc++.h>
using namespace std;
int arr[5000005],k;
void quicksort(int left,int right){
int i = left;int j = right;int base = (i+j)/2;
int tem;
while(i<=j){
while(arr[i]<arr[base]) i++;
while(arr[j]>arr[base]) j--;
if(i<=j){
swap(arr[i],arr[j]);
i++;
j--;
}
}
if(k<=j) quicksort(left,j);
else if(k>=i) quicksort(i,right);
else {
cout<<arr[j+1];
exit(0);
}
}
int main()
{
int n;
scanf("%d%d",&n,&k);
for(int i=0;i<n;i++)
scanf("%d",&arr[i]);
quicksort(0,n-1);
}
by 帝都_henry26268 @ 2024-01-22 08:17:17
@Hauauah
额,我大概找到你的bug了
对于快排来说,是选定一个数作为中间点Mid,左右点依据Mid分成 L,Mid 和 Mid,R
按照这一个固定数进行二分,
但在你的代码中这个固定数在一定过程后可能被swap跳掉了导致这个数不为固定
具体的
void quicksort(int left,int right){
int i = left,j = right;
int Mid = arr[(left+right)>>1];//这里改了
while(i<=j){
//这里应该是Mid
while(arr[i] < Mid) i++;
while(arr[j] > Mid) j--;
if(i<=j){
swap(arr[i],arr[j]);
i++;j--;
}
}
if(k<=j) quicksort(left,j);
else if(k>=i) quicksort(i,right);
else{
cout << arr[j+1] << endl;
return ;
}
}
by Lightning_ @ 2024-02-28 22:49:35
@帝都_henry26268 测试样例通过的话不应该对一个吗?
by 帝都_henry26268 @ 2024-02-29 07:32:59
@Lightning_ 我没说样例测试通过啊?或者你指的什么意思我没明白。。。