程式設計之美2 10 尋找陣列中的最大值和最小值

2021-09-07 12:34:08 字數 2413 閱讀 9721

這個問題事實上非常easy解決。就是迴圈遍歷一遍陣列,然後找到陣列中存在的最大值和最小值就能夠了,書中主要討論的問題是比較次數較小的方法。只是。書中已經證明了,不管用什麼方法最少的比較次數也就是迴圈遍歷一遍的比較,結果是o(1.5n)的。所以。非常easy的能夠解決問題。

第一種方法:

函式宣告:

void dutfindmaxandmininarray_1(int*, int, int&, int&);
原始碼例如以下:

/*主要的解法尋找最大值和最小值*/

bool _dutfindmaxandmininarray = false;

void dutfindmaxandmininarray_1(int* a, int size, int& _max, int& _min)

if (size == 1)

if (a[0] >= a[1])

else

/*過一遍迴圈,一次進行比對就可以*/

for (int i = 2; i < size; ++i)

else if (a[i] < _min)

}}

然後。我們能夠利用分治的解法去解決問題,意思就是尋找陣列的前一半中的最大值和最小值,尋找陣列後一半的最大值和最小值,然後再利用分治把原問題分成更小的問題。

函式宣告:

void dutfindmaxandmininarray_2(int*, int, int&, int&);

void dutfindmaxandmininarray_2(int*, int, int, int&, int&);

原始碼例如以下:

/*分治的方法尋找最大值和最小值*/

void dutfindmaxandmininarray_2(int* a, int size, int& max, int& min)

dutfindmaxandmininarray_2(a, 0, size - 1, max, min);

}void dutfindmaxandmininarray_2(int* a, int low, int high, int& max, int& min)

else

}int maxl, minl;

int maxr, minr;

/*分別在左半邊和右半邊尋找最大值和最小值,之後比對兩邊的最值就能夠了*/

dutfindmaxandmininarray_2(a, low, low + (high - low) / 2, maxl, minl);

dutfindmaxandmininarray_2(a, low + (high - low) / 2 + 1, high, maxr, minr);

if (maxl > maxr)

else

if (minl > minr)

else

}

接下來,我們來看下書中的擴充套件問題。即如何尋找陣列中的第二大值。

事實上這個問題也是能夠利用前面的分治思想。即尋找陣列前面的一半符合要求的數值,再尋找陣列後面的一半符合要求的數值就能夠了。

函式宣告:

/*2.10擴充套件 尋找第二大數值*/

void dutfindmaxandsecondmax(int*, int, int&, int&);

void dutfindmaxandsecondmax(int*, int, int, int&, int&);

原始碼例如以下:

/*分治的思想尋找最大值和第二大值*/

bool _dutfindmaxandsecondmax= false;

void dutfindmaxandsecondmax(int* a, int size, int& max, int& max2)

dutfindmaxandsecondmax(a, 0, size - 1, max, max2);

}void dutfindmaxandsecondmax(int* a, int low, int high, int& max, int& max2)

else

}int maxl, maxl2;

int maxr, maxr2;

/*找到兩邊的最大值和次大值。依照比較順序比較就可以*/

dutfindmaxandsecondmax(a, low, low + (high - low) / 2, maxl, maxl2);

dutfindmaxandsecondmax(a, low + (high - low) / 2 + 1, high, maxr, maxr2);

if (maxl > maxr)

else

}else

else

}}

程式設計之美 尋找陣列中最大的K個數

從別人的那裡轉過來,這種題目,其實就是需要使用分治方法 程式設計之美上的尋找n個數中最大的前k數,給出了一種演算法,我認為比較好 演算法是這樣寫的 假設n個數儲存在陣列s中,我們從陣列s中隨機選出乙個元素x,把陣列分為兩部分sa和sb.sa中的元素都大於x,sb中的元素都小於x,這時,有兩種可能性 ...

程式設計之美 尋找最大的K個數

有很多個無序數,我們姑且假定他們各不相等,怎麼挑選出其中最大的若干個數呢?如果這個資料量很大,比如1億個,如果所存資料是浮點型呢?我們該怎麼處理呢?分兩部分,第一部分是我個人的解答,第二部分是書上的解答 第一部分 1,如果這個問題裡的資料都是整數,這個問題利用hash對映應該很簡單,就是在開闢乙個陣...

程式設計之美 尋找最大的K個數

有很多個無序數,我們姑且假定他們各不相等,怎麼挑選出其中最大的若干個數呢?如果這個資料量很大,比如1億個,如果所存資料是浮點型呢?我們該怎麼處理呢?分兩部分,第一部分是我個人的解答,第二部分是書上的解答 第一部分 1,如果這個問題裡的資料都是整數,這個問題利用hash對映應該很簡單,就是在開闢乙個陣...