1. 程式人生 > >筆試題&面試題:給定n個數,要求比較次數1.5n同時找出最大值和最小值

筆試題&面試題:給定n個數,要求比較次數1.5n同時找出最大值和最小值

寫出一個演算法,對給定的n個數的序列,返回序列中的最大和最小的數.
設計出一個演算法,只需要執行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;
}
程式執行結果截圖: