來自:【數據結構與算法分析——C語言描述】練習1.1
問題描述:編寫一個程序解決選擇問題。令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; srand((unsigned)time(NULL)); arr = (int *)malloc(sizeof(int) * N);; for (int j = 0; j < N; j++) { arr[j] = rand() % 100000; printf("%d ", arr[j]); } 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[0] = arr[0]; for (i = 1; i < k; i++) //讀入k個元素並降序排列 { tmp[i] = arr[i]; for (j = i; j > 0; j--) { if (arr[i] > tmp[j - 1]) { tmp[j] = tmp[j - 1]; tmp[j - 1] = arr[i]; } } } for (i = k; i < n; i++) //讀入arr[k] { if (tmp[k - 1] < arr[i]) { tmp[k - 1] = arr[i]; for (j = k - 1; j > 0; j--) { if (arr[i] > tmp[j - 1]) { tmp[j] = tmp[j - 1]; tmp[j - 1] = arr[i]; } } } } ret = tmp[k - 1]; free(tmp); return ret; }
記錄:
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 |
小記:該算法在輸入數據量較少時,可以在合理的時間內給出結果。如果數據量過大,這個算法就不切實際了。