线性时间选择问题,实际上是随机快速排序算法的一个引申,ie,通过对随机快速排序算法的小小改动就可以实现。
算法依然参考算法导论中的相关内容,需要注意的是,
代码中 的id 是指 所要 找的量在 现有区间 【low, high】中的位置, 因而,需要涉及 一定转化。 ps: mid - low + 1 表示 我们划分出来的第一个区间的长度大小。
源代码如下:
// =====================【随机选择 】==================
// @ author : zhyh2010
// @ date : 20150606
// @ version : 1.0
// @ description :
// =====================【随机选择】==================
#include <stdio.h>
#include <stdlib.h>
#define NUM 20
int arr[NUM] = { 0 };
void init()
{
time_t tm;
time(&tm);
srand((unsigned int)tm);
int max_item = 100;
for (int i = 0; i != NUM; i++)
arr[i] = rand() % max_item;
}
void swap(int * pa, int * pb)
{
int aa = *pa;
int bb = *pb;
aa = aa ^ bb;
bb = aa ^ bb;
aa = aa ^ bb;
*pa = aa;
*pb = bb;
}
void display(int * arr)
{
for (int i = 0; i != NUM; i++)
printf("%-10d", arr[i]);
printf("\n");
}
int Partition(int low, int high)
{
int privot = arr[high];
int i = low - 1;
for (int j = low; j != high; j++)
{
if (arr[j] <= privot)
swap(&arr[j], &arr[++i]);
}
swap(&arr[i + 1], &arr[high]);
return i + 1;
}
int RandomPartition(int low, int high)
{
time_t tm;
time(&tm);
srand((unsigned int)tm);
int id = rand() % NUM;
swap(&arr[id], &arr[NUM - 1]);
return Partition(low, high);
}
int RandomSelect(int low, int high, int id)
{
if (low >= high)
return arr[low];
int mid = RandomPartition(low, high);
int k = mid - low + 1;
if (k == id)
return arr[mid];
if (id > k)
return RandomSelect(mid + 1, high, id - k);
else
return RandomSelect(low, mid - 1, id);
}
void main()
{
init();
display(arr);
int k = 5;
int res = RandomSelect(0, NUM - 1, k);
printf("the %d th number of the arr is %d\n", k, res);
}
时间: 2024-10-19 13:54:08