-
10 5180 2970 663 5480 4192 4949 1 1387 4428 5180 2761
样例输出
输入
第1行:2个整数N,K。N表示数组长度,K表示需要查找的数
输出
第1行:一个整数t,表示K在数组中是第t小的数,若K不在数组中,输出-1
第2行:N个整数,表示a[1..N],保证不会出现重复的数,1≤a[i]≤2,000,000,000
9
#include
#include
using namespace std;
#define swap(x, t, y) (t = x, x = y, y = t)//交换x和y
int a[1111111], k;
int find(int s, int e)//快排思想
{
if(s == e && a[s] != k)
return -1;
int i = s - 1, j, t, r, x = a[e];
for(j = s; j < e; j++)
{
if(a[j] <= x)
{
i++;
swap(a[i], t, a[j]);
}
}
swap(a[i + 1], t, a[e]);
if(a[i + 1] < k)
{
r = rand()%(e - i - 1) + i + 2;//随机选择a[r]作为主元
swap(a[r], t, a[e]);
find(i + 2, e);
}
else if(a[i + 1] > k)
{
r = rand()%(i + 1 - s) + s;
swap(a[r], t, a[i]);
find(s, i);
}
else
return i + 1;
}
int main(void)
{
int i, n, r, t;
cin>>n>>k;
for(i = 1; i <= n; i++)
cin>>a[i];
r = rand()%n + 1;
swap(a[r], t, a[n]);
cout<