來自:【數據結構與算法分析——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 |
小記:該算法在輸入數據量較少時,可以在合理的時間內給出結果。如果數據量過大,這個算法就不切實際了。
