給出一個分治演算法來找出n個元素序列中第2大的元素
阿新 • • 發佈:2018-12-13
題目:給出一個分治演算法來找出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; }