题目:编写一个程序解决选择问题。令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 |
小记:该算法在输入数据量较少时,可以在合理的时间内给出结果。如果数据量过大,这个算法就不切实际了。
时间: 2024-10-25 15:31:31