這個問題事實上非常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對映應該很簡單,就是在開闢乙個陣...