資料結構與演算法分析(c 語言描述)習題 1.1

jerrkill發表於2018-12-12
/**
 * 問題描述:編寫一個程式解決選擇問題。令k = N / 2。畫出表格顯示你的程式對於N為不同值時的執行時間。
 *(設有一組 N 個數確定其中第 k 個最大者,稱選擇問題(selection problem))
 */

#include <stdio.h>
#include <stdlib.h>
#include <time.h>

#define N 100000

/*宣告函式*/
int my_select(int arr[], int n, int k);

/*main 函式*/
int main(void)
{
    int * arr;
    int value;
    // int N;
    clock_t elapse;

    // scanf("%d", &N);

    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]);
    }
    printf("\n");
    // putchar("\n");

    elapse = clock();
    value = my_select(arr, N, N / 2);
    elapse = clock() - elapse;
    printf("Value: %d, elapsed: %.4lfs\n", value, (double)elapse / CLOCKS_PER_SEC);

    free(arr);
    // system("PAUSE");
    return 0;
}

/* 選擇陣列中第k個最大者 */
int my_select( int arr[], int n, int k)
{
    int * tmp;
    int i, j, ret;

    tmp = (int *)malloc(sizeof(int) * k); /*手動開闢記憶體空間*/
    tmp[0] = arr[0];
    /*讀入k個元素並降序排序*/
    for (i = 1; i < k; i++) {
        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];
            }
        }
    }
    /*讀入arr[k,...]元素*/
    for (i = k; i < n; i++) {
        if (arr[i] > tmp[k-1]) {
            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;
}

高度自律,深度思考,以勤補拙

相關文章