mingcxx 发表于 2016-9-10 20:37:30

数据结构与算法分析_选择问题

本帖最后由 mingcxx 于 2016-9-10 20:42 编辑

题目:编写一个程序解决选择问题。令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;

    system("color 0A");

    srand((unsigned)time(NULL));
    arr = (int *)malloc(sizeof(int) * N);;
    for (int j = 0; j < N; j++)
    {
      arr = rand() % 100000;
      printf("%d ", arr);
    }
    putchar('\n');

    elapse = clock();
    value = select(arr, N, N / 2);
    elapse = clock() - elapse;
    printf("Value: %d, elapsed: %.4lfs\n", 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 = arr;
    for (i = 1; i < k; i++)            //读入k个元素并降序排列
    {
      tmp = arr;
      for (j = i; j > 0; j--)
      {
            if (arr > tmp)
            {
                tmp = tmp;
                tmp = arr;
            }
      }
    }

    for (i = k; i < n; i++)            //读入arr
    {
      if (tmp < arr)
      {
            tmp = arr;
            for (j = k - 1; j > 0; j--)
            {
                if (arr > tmp)
                {
                  tmp = tmp;
                  tmp = arr;
                }
            }
      }
    }

    ret = tmp;
    free(tmp);
    return ret;
}记录:

小记:该算法在输入数据量较少时,可以在合理的时间内给出结果。如果数据量过大,这个算法就不切实际了。
页: [1]
查看完整版本: 数据结构与算法分析_选择问题