快速找中值

##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);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值