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

Posted mingc

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构与算法分析(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 = 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的主要内容,如果未能解决你的问题,请参考以下文章

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

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

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

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

推荐 3 个学习C语言算法与习题的平台

算法1.1课后问答及习题