選擇問題


來自:【數據結構與算法分析——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

小記:該算法在輸入數據量較少時,可以在合理的時間內給出結果。如果數據量過大,這個算法就不切實際了。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM