1. 程式人生 > >給出一個分治演算法來找出n個元素序列中第2大的元素

給出一個分治演算法來找出n個元素序列中第2大的元素

題目:給出一個分治演算法來找出n個元素序列中的第2大的元素。

如果不是題目要求用分治法,用遍歷或排序都比這個分治法要快。下面說說解題思路吧

解題思路:當序列A[1..n]中元素的個數n=2時,通過直接比較即可找出序列的第2大元素。當n>2時,先求出序列A[1..n-1]中的第1大元素x1和第2大元素x2;然後,通過2次比較即可在三個元素x1,x2和A[n]中找出第2大元素,該元素即為A[1..n]中第2大元素。

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

int a[100];
int n;

int max;   //當前最大元素 
int f(int n)  
{
	int min;   //當前最小元素 
	if(n==2)     //只有兩個元素時,直接求解(最小問題) 
	{
		if(a[n-2]>a[n-1])
			max=a[n-2],min=a[n-1];
		else
			max=a[n-1],min=a[n-2]; 
		return min;
	}
	else
	{ 
		min=f(n-1);		//遞迴找第二大元素 
		if(a[n-1]>max) min=max,max=a[n-1];   //找到前面n-1個元素中最大和第二大元素時
		if(a[n-1]<max&&a[n-1]>min) min=a[n-1]; //再與第n個元素比較找第二大元素 
		return min;   //返回結果 
	}
}

void random() 
{
	srand(time(NULL));
	for(int i=0;i<n;i++)
	{
		a[i]=1+rand()%100;
	}
}

int main()
{
	
	int s;
	printf("請輸入元素的個數n:");
	scanf("%d",&n);
	random();
	printf("\n這n個數依次為: ");
	for(int j=0;j<n;j++)
		printf("%d\t",a[j]);
	s=f(n);
	printf("\n\n這n個數中第二大元素為:%d\n",s);
	return 0;
}