首页 > 代码库 > 数据结构与算法分析(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
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。