牛骨文教育服务平台(让学习变的简单)
博文笔记

快速找中值

创建时间:2016-07-15 投稿人: 浏览次数:485

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);
}
声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。