//该程序只能实现互异元素的查找
#include
#include
#include
#define swap(x, temp, y) (temp = x, x = y, y = temp)
//找到[p,r]之间坐标z+1,左边全小于该坐标处值,右边大于等于该坐标处值
int random_partition(int a[], int p, int r)
{
int q, i, temp,
z = p - 1;
srand(time(NULL));
q = rand()%(r - p + 1) + p;//随机产生[p,r]区间上一元素
swap(a[q], temp, a[r]);
for(i = p; i < r; i++)
{
if(a[i] < a[r])
{
z++;
swap(a[z], temp, a[i]);
}
}
swap(a[r], temp, a[z + 1]);
return z + 1;
}
//找第j小元素
int random_select(int a[], int p, int r, int j)
{
int q, k;
if(p == r)
{
return a[p];
}
q = random_partition(a, p, r);
k = q - p + 1;
if(j == k)
{
return a[q];
}
else if(j < k)
{
return random_select(a, p, q - 1, j);
}
else
{
return random_select(a, q + 1, r, j - k);
}
}
int main(void)
{
int i, j, n, a[111], j_min;
scanf("%d", &n);
for(i = 1; i <= n; i++)
{
scanf("%d", &a[i]);
}
scanf("%d", &j);
j_min = random_select(a, 1, n, j);
printf("%d\n", j_min);
system("pause");
}
找第j小元素(递归实现)
最新推荐文章于 2021-05-23 11:20:26 发布