zoukankan      html  css  js  c++  java
  • 选择问题

    来自:【数据结构与算法分析——C语言描述】练习1.1

    问题描述:编写一个程序解决选择问题。令k = N / 2。画出表格显示你的程序对于N为不同值时的运行时间。

    (设有一组 N 个数确定其中第 k 个最大者,称选择问题(selection problem))

    思路:读入前 k 个数到临时数组 tmp(并按降序排列)。然后逐个读取后续数字 X ,当 X 大于第 k 个数时,将其加入数组 tmp(并按降序排列)。最后返回位置 k - 1 上的值。

    实现:

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
     
    #define N 10000
     
    int select(int arr[], int n, int k);
     
    int main(void)
    {
        int * arr;
        int value;
        clock_t elapse;
     
        srand((unsigned)time(NULL));
        arr = (int *)malloc(sizeof(int) * N);;
        for (int j = 0; j < N; j++)
        {
            arr[j] = rand() % 100000;
            printf("%d ", arr[j]);
        }
        putchar('
    ');
     
        elapse = clock();
        value = select(arr, N, N / 2);
        elapse = clock() - elapse;
        printf("Value: %d, elapsed: %.4lfs
    ", value, (double)elapse / 1000);
     
        free(arr);
        system("pause");
        return 0;
    }
      
    /* 选择数组中第k个最大者 */
    int select(int arr[], int n, int k)
    {
        int * tmp;
        int i, j, ret;
     
        tmp = (int *)malloc(sizeof(int) * k);
        tmp[0] = arr[0];
        for (i = 1; i < k; i++)            //读入k个元素并降序排列
        {
            tmp[i] = arr[i];
            for (j = i; j > 0; j--)
            {
                if (arr[i] > tmp[j - 1])
                {
                    tmp[j] = tmp[j - 1];
                    tmp[j - 1] = arr[i];
                }
            }
        }
     
        for (i = k; i < n; i++)            //读入arr[k]
        {
            if (tmp[k - 1] < arr[i])
            {
                tmp[k - 1] = arr[i];
                for (j = k - 1; j > 0; j--)
                {
                    if (arr[i] > tmp[j - 1])
                    {
                        tmp[j] = tmp[j - 1];
                        tmp[j - 1] = arr[i];
                    }
                }
            }
        }
     
        ret = tmp[k - 1];
        free(tmp);
        return ret;
    }

    记录:

    N值 耗时(秒)

    10000

    0.0820

    20000

    0.3260

    30000

    0.7320

    40000

    1.3080

    50000

    2.0320

    60000

    2.9390

    70000

    3.9990

    80000

    5.2160

    90000

    6.6530

    100000

    8.1610

    小记:该算法在输入数据量较少时,可以在合理的时间内给出结果。如果数据量过大,这个算法就不切实际了。

  • 相关阅读:
    MSSQL大量数据时,建立索引或添加字段后保存更改超时该这么办
    POJ 3261 Milk Patterns (后缀数组)
    POJ 1743 Musical Theme (后缀数组)
    HDU 1496 Equations (HASH)
    694. Distinct Substrings (后缀数组)
    POJ 1222 EXTENDED LIGHTS OUT (枚举 或者 高斯消元)
    POJ 1681· Painter's Problem (位压缩 或 高斯消元)
    POJ 1054 The Troublesome Frog (hash散列)
    HDU 1716 排列2
    HDU 4405 Aeroplane chess (概率DP & 期望)
  • 原文地址:https://www.cnblogs.com/mingc/p/5860021.html
Copyright © 2011-2022 走看看