给出一个分治算法来找出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;
}

猜你喜欢

转载自blog.csdn.net/qq_41045071/article/details/82952130