尋找一個數組中的最大和最小數

工作一段快兩年了,感覺之前學的數據結構和算法基本忘得差不多了,最近一段時間準備複習一下相關知識。

有一個求數組中最大和最小數的題目,基本的思路是遍歷一遍數組,然後每個一個元素都和最大值和最小值比較,時間複雜度是2(N-1)或2N。

比較簡單的一種減少複雜度的方法是把數組的元素兩兩分組比較,然後較大的數和max比較,較小的數和min比較,這種實現方法的時間複雜度是1.5N。

還有一種是採用分治法,比較次數也是1.5N,思路是將數組一分爲二,分別獲取兩個子數組的最大和最小值,然後進行取兩個子數組中較小的最小值和較大的最大值。

O(N) = (N/2 + N/4 + … + N/2^(log2(N))) = 3N/2 ?

   #include <cstdio>

    void max_min(int a[], int begin, int end, int *max, int *min) {
        if (end == begin) {
            *max = a[begin];
            *min = a[end];

            return;
        }
        int l_max, r_max;
        int l_min, r_min;
        max_min(a, begin, begin + (end - begin) / 2, &l_max, &l_min);
        max_min(a, begin + (end - begin) / 2 + 1, end, &r_max, &r_min);
        *max = l_max > r_max ? l_max : r_max;
        *min = l_min < r_min ? l_min : r_min;
    }

    int main() {
        int array[] = {5,7,8,9,11,13,45,8,9,23,45,97,3,2,7,14,64};
        int len = sizeof(array) / sizeof(int);
        int max = array[0];
        int min = array[0];
        for (int i = 1; i < len; ++i) {
            if (array[i] > max) {
                max = array[i];
            } else if (array[i] < min){
                min = array[i];
            }
        }
        printf("max:%d min:%d\", max, min);
        int start = -1;
        if (len & 0x1) {
            start = 1;
        } else {
            start = 0;
        }
        for (int i = start; i < len; i+=2) {
            if (array[i] > array[i + 1]) {
                if (array[i] > max) max = array[i];
                if (array[i + 1] < min) min = array[i + 1];
            } else if (array[i] < array[i + 1]) {
                if (array[i] < min) min = array[i];
                if (array[i + 1] > max) max = array[i + 1];
            }
        }
        printf("max:%d min:%d\", max, min);

        max_min(array, 0, len - 1, &max, &min);
        printf("max:%d min:%d\", max, min);

        return 0;
    }

歡迎點擊

發佈了24 篇原創文章 · 獲贊 7 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章