1. 程式人生 > >C語言筆記19--找出第n大的數

C語言筆記19--找出第n大的數

這是一道面試的題目,題目大意是:找出陣列中第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");
}