筆試題&面試題:給定n個數,要求比較次數1.5n同時找出最大值和最小值
阿新 • • 發佈:2019-02-02
寫出一個演算法,對給定的n個數的序列,返回序列中的最大和最小的數.
設計出一個演算法,只需要執行1.5n次比較就能找到序列中最大和最小的數嗎?能否再少?
設計出一個演算法,只需要執行1.5n次比較就能找到序列中最大和最小的數嗎?能否再少?
分析:要求比較次數為1.5n,使用一般的逐個遍歷每個元素然後判斷其是否為最大最小值是需要2n次的比較的,所以這樣的方法是行不通的。現在考慮採用,每次從陣列中取出兩個元素,判斷其大小,然後再分別判斷其是否是最大或最小值,這樣一次處理兩個元素,每一次比較3次,最終的比較次數就是n/2*3=1.5n。C語言程式碼如下:
程式執行結果截圖:#include <stdio.h> #define MIN -1 #define MAX 65535 void find_max_min(int num[], int len) { int i, j; int max = MIN; int min = MAX; int tmax, tmin; int count = 0; /*用來統計比較次數*/ i = 0; j = len - 1; while(i <= j) { if(num[i] < num[j]) { tmax = num[j]; tmin = num[i]; count ++; } else { tmax = num[i]; tmin = num[j]; count ++; } if(min > tmin) min = tmin; if(max < tmax) max = tmax; count += 2; /*上面的兩次比較*/ i ++; j --; } printf("The max number is: %d.\n", max); printf("The min number is: %d.\n", min); printf("Compare number is: %d.\n", count); } int main() { int num[10] = {2, 4, 5, 6, 8, 3, 7, 1, 9, 10}; find_max_min(num, 10); return 0; }