返回列表 發帖

輸出整數陣列第三大數

用排序法寫
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. void bubble_sort(int arr[], int len) {//自訂函數由大而小排序
  4.     int i, j, temp;
  5.     for (i = 0; i < len - 1; i++)
  6.         for (j = 0; j < len - 1 - i; j++)
  7.             if (arr[j] < arr[j + 1]) {
  8.                 temp = arr[j];
  9.                 arr[j] = arr[j + 1];
  10.                 arr[j + 1] = temp;
  11.             }
  12. }
  13. int main() {
  14.     int n;
  15.     printf("Enter array length:");
  16.     scanf("%d",&n);
  17.     int arr[n] ;
  18.     for(int i=0;i<n;i++)
  19.         scanf("%d",&arr[i]);
  20.     //int len = (int) sizeof(arr) / sizeof(*arr);//陣列的大小
  21.     bubble_sort(arr, n);//呼叫函數由大而小排序
  22.     int i;
  23.     int r=1;//最大數的r值設定為1
  24.     for (i = 1; i < n; i++){//從第2大數開始拜訪
  25.         r++;//每拜訪一個,r就加1
  26.         if(arr[i]==arr[i-1])//如果該數重覆出現
  27.             r--;//r就不要加1
  28.         if(r==3){//如果r值是3
  29.             printf("The result is %d. ", arr[i]);//找到第3大數
  30.             break;//離開迴圈,不必再找了
  31.          }
  32.     }

  33.         if(r<3)//如果跑完迴圈,r值小於3,表示沒有第3大數
  34.            printf("The result is %d. ", arr[0]);//輸出最大數

  35.     return 0;
  36. }
複製代碼
排序的方法有很多,以下是用選擇排序法寫:
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. void selection_sort(int arr[], int len) {//自訂函數由大而小排序
  4.     int i, j, temp;
  5.     for (i = 0; i < len - 1; i++)
  6.         for (j = i+1; j < len; j++)
  7.                 if (arr[i] < arr[j ]) {
  8.                 temp = arr[j];
  9.                 arr[j] = arr[i];
  10.                 arr[i] = temp;
  11.             }
  12. }
  13. int main() {
  14.     int n;
  15.     printf("Enter array length:");
  16.     scanf("%d",&n);
  17.     int arr[n] ;
  18.     for(int i=0;i<n;i++)
  19.         scanf("%d",&arr[i]);
  20.     //int len = (int) sizeof(arr) / sizeof(*arr);//陣列的大小
  21.     selection_sort(arr, n);//呼叫函數由大而小排序
  22.     int i;
  23.     int r=1;//最大數的r值設定為1
  24.     for (i = 1; i < n; i++){//從第2大數開始拜訪
  25.         r++;//每拜訪一個,r就加1
  26.         if(arr[i]==arr[i-1])//如果該數重覆出現
  27.             r--;//r就不要加1
  28.         if(r==3){//如果r值是3
  29.            printf("The result is %d. ", arr[i]);//找到第3大數
  30.            break;//離開迴圈
  31.         }
  32.     }

  33.         if(r<3)//如果跑完迴圈,r值小於3,表示沒有第3大數
  34.            printf("The result is %d. ", arr[0]);//輸出最大數

  35.     return 0;
  36. }
複製代碼
不用排序法寫
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int main(){
  4.     int n,i,c,t,first,second,third;
  5.     printf("Enter array length:");
  6.     scanf("%d",&n);
  7.     int a[n];
  8.     for(i=0; i<n; i++){
  9.         scanf("%d",&a[i]);
  10.     }
  11.     first=second=third=0;
  12.     for(i=0; i<n; i++) //一個個數字拿出來看
  13.     {
  14.         c = a[i];   //放在c方便把被超越的數字往下比
  15.         if(c > first) //比最大的數大,就跟最大的數交換
  16.         {
  17.             t = first;
  18.             first = c;
  19.             c = t;
  20.         }
  21.         if(c == first) //重複的數就丟掉
  22.             c = 0;
  23.         if(c > second) //比第二大的數大,就跟第二大的數交換
  24.         {
  25.             t = second;
  26.             second = c;
  27.             c = t;
  28.         }
  29.         if(c == second) //重複的數就丟掉
  30.             c = 0;
  31.         if(c > third) //比第三大的數大,就跟第三大的數交換
  32.         {
  33.             t = third;
  34.             third = c;
  35.             c = t;
  36.         }
  37.     }
  38.     if(third > 0) //有第三大的數就印出第三大的數
  39.         printf("The result is %d.",third);
  40.     else         //沒有第三大的數就印出最大的數
  41.         printf("The result is %d.",first);

  42.     return 0;
  43. }
複製代碼
排序法應該還是比較慢,因為排序時,必須跑兩層迴圈。
排序的程式優點是可以用來解決複雜問題。
不排序的寫法只適用於簡單演算法的程式。太複雜就很難實作了。
May

返回列表