C語言筆記19--找出第n大的數
阿新 • • 發佈:2018-11-17
這是一道面試的題目,題目大意是:找出陣列中第n大的數,例如:輸入1,則返回最大的值。
有一些極端情況是,例如找出第二大的數,如果陣列全都是同一個數,即沒有第二大的數。這題目我採用了冒泡法,因為每一次冒泡,都可以找出剩下數中的最大值,每次找出的最大值與陣列中最大值比較,相等即說明都是最大值,不等即說明是第i大的值,當i與n相等時,即說明找到第n大的值
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #define M 10 void printfarray(int *p,int num) { for(int i=0;i<num;i++) { printf("%5d",p[i]); } } //交換 void swap(int *pa,int *pb) { int temp=*pa; *pa=*pb; *pb=temp; } //求出陣列中最大值 int getmax(int *p,int num) { int max=p[0]; for(int i=1;i<num;i++) { if(p[i]>max) { max=p[i]; } } return max;//返回最大值 } void main() { int a[M]={12,23,56,89,45,21,65,88,99,123}; printf("請輸入要查詢第幾大的數:"); unsigned int n; scanf("%u",&n); printfarray(a,M);//打印出陣列 if(n>10||n==0)//大於10和0不考慮 { printf("\n輸入有誤"); } else { int flag=0;//找到的標誌,找到為1,否則為0 int max=getmax(a,M);//先求出最大值 if(n==1)//n是1的話直接列印最大值 { flag=1; printf("\n第%d大的值是:%d",n,max); } else//否則進行氣泡排序 { int maxi=1;//儲存找到第幾大數 for(int i=0;i<M;i++)//這裡必須要到M,不然最後一個沒有進行比較 { for(int j=i;j<M;j++) { if(a[i]<a[j])//降序冒泡 { swap(&a[i],&a[j]); } } if(max!=a[i])//a[i]為每次找出的最大值 { maxi++;//不相等證明不是同一個數 } if(maxi==n)//當兩者相等,即找到 { flag=1; printf("\n第%d大的值是:%d",n,a[i]); break; } } } if(!flag)//為0時即沒有找到 { printf("\n沒有找到"); } } system("pause"); }