##n个0-MAX范围内的随机数,如何快速的找到其中值数;
特点:数值范围固定;
测试
//1000个0-32的随机数组,采用两种方法寻找中值,比较运行时间;
#include "stdafx.h"
#include <time.h>
#include <stdlib.h>
#define COUNT 1000
#define RANGE 32
void rank(int numbers[]);
void tags(int numbers[]);
void main(void)
{
clock_t start = clock(); // 记录运行时间
int numbers[COUNT] = {0}; // 生成100个0-32的随机数
srand((unsigned)time(0));
for(int i = 0; i < COUNT; i++)
{
numbers[i] = rand()/(int)(RAND_MAX/(RANGE-1)); // 不含32
printf("%5d", numbers[i]);
if ((i + 1) % 10 == 0)
printf("\n");
}
printf("----------------------------------------------------\n");
rank(numbers);
tags(numbers);
clock_t end = clock();
printf("all need time: %d!\n", end-start);
}
// 元数标记法一:标记元素出现个数,取中间个数;运行时间约为15ms
void tags(int numbers[])
{
clock_t start = clock();
int mid = 0;
int tag[RANGE] = { 0 };
for (int i = 0; i < COUNT; ++i)
tag[numbers[i]]++;
for (int i = 0; i < RANGE; ++i)
{
mid += tag[i];
if (mid >= (COUNT / 2 + 1))
{
printf("tag find: %d!\n", i);
break;
}
}
clock_t end = clock();
printf("tags need time: %d!\n", end-start);
}
// 遍历排序法二:循环排序后找中值,时间约为120ms;
void rank(int numbers[])
{
clock_t start = clock();
int temp = 0;
for(int i=0; i < COUNT-1; i++)
{
for(int j = i + 1; j < COUNT; j++) /*注意循环的上下限*/
{
if(numbers[i] > numbers[j])
{
temp = numbers[i];
numbers[i] = numbers[j];
numbers[j] = temp;
}
}
}
for(int i = 0; i < COUNT; i++)
{
printf("%5d", numbers[i]);
if ((i + 1) % 10 == 0)
printf("\n");
}
printf("rank find: %d!\n", numbers[COUNT/2+1]);
clock_t end = clock();
printf("rank need time: %d!\n", end-start);
}