首页 > 代码库 > 数据结构与算法分析(C语言描述)习题1.1

数据结构与算法分析(C语言描述)习题1.1

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

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

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

实现:

 1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <time.h> 4  5 #define N 10000 6  7 int select(int arr[], int n, int k); 8  9 int main(void)10 {11     int * arr;12     int value;13     clock_t elapse;14 15     system("color 0A");16 17     srand((unsigned)time(NULL));18     arr = (int *)malloc(sizeof(int) * N);;19     for (int j = 0; j < N; j++)20     {21         arr[j] = rand() % 100000;22         printf("%d ", arr[j]);23     }24     putchar(\n);25 26     elapse = clock();27     value = http://www.mamicode.com/select(arr, N, N / 2);28     elapse = clock() - elapse;29     printf("Value: %d, elapsed: %.4lfs\n", value, (double)elapse / 1000);30 31     free(arr);32     system("pause");33     return 0;34 }35  36 /*选择数组中第k个最大者*/37 int select(int arr[], int n, int k)38 {39     int * tmp;40     int i, j, ret;41 42     tmp = (int *)malloc(sizeof(int) * k);43     tmp[0] = arr[0];44     for (i = 1; i < k; i++)            //读入k个元素并降序排列45     {46         tmp[i] = arr[i];47         for (j = i; j > 0; j--)48         {49             if (arr[i] > tmp[j - 1])50             {51                 tmp[j] = tmp[j - 1];52                 tmp[j - 1] = arr[i];53             }54         }55     }56 57     for (i = k; i < n; i++)            //读入arr[k]58     {59         if (tmp[k - 1] < arr[i])60         {61             tmp[k - 1] = arr[i];62             for (j = k - 1; j > 0; j--)63             {64                 if (arr[i] > tmp[j - 1])65                 {66                     tmp[j] = tmp[j - 1];67                     tmp[j - 1] = arr[i];68                 }69             }70         }71     }72 73     ret = tmp[k - 1];74     free(tmp);75     return ret;76 }

 记录:

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

数据结构与算法分析(C语言描述)习题1.1