快速找中值
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("
");
}
printf("----------------------------------------------------
");
rank(numbers);
tags(numbers);
clock_t end = clock();
printf("all need time: %d!
", 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!
", i);
break;
}
}
clock_t end = clock();
printf("tags need time: %d!
", 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("
");
}
printf("rank find: %d!
", numbers[COUNT/2+1]);
clock_t end = clock();
printf("rank need time: %d!
", end-start);
}
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。
- 上一篇: Maven install:javac:无效的目标版本1.8
- 下一篇: 移动端开发适配2种方案总结