用排序法寫- #include<stdio.h>
- #include<stdlib.h>
- void bubble_sort(int arr[], int len) {//自訂函數由大而小排序
- int i, j, temp;
- for (i = 0; i < len - 1; i++)
- for (j = 0; j < len - 1 - i; j++)
- if (arr[j] < arr[j + 1]) {
- temp = arr[j];
- arr[j] = arr[j + 1];
- arr[j + 1] = temp;
- }
- }
- int main() {
- int n;
- printf("Enter array length:");
- scanf("%d",&n);
- int arr[n] ;
- for(int i=0;i<n;i++)
- scanf("%d",&arr[i]);
- //int len = (int) sizeof(arr) / sizeof(*arr);//陣列的大小
- bubble_sort(arr, n);//呼叫函數由大而小排序
- int i;
- int r=1;//最大數的r值設定為1
- for (i = 1; i < n; i++){//從第2大數開始拜訪
- r++;//每拜訪一個,r就加1
- if(arr[i]==arr[i-1])//如果該數重覆出現
- r--;//r就不要加1
- if(r==3){//如果r值是3
- printf("The result is %d. ", arr[i]);//找到第3大數
- break;//離開迴圈,不必再找了
- }
- }
- if(r<3)//如果跑完迴圈,r值小於3,表示沒有第3大數
- printf("The result is %d. ", arr[0]);//輸出最大數
- return 0;
- }
複製代碼 排序的方法有很多,以下是用選擇排序法寫:- #include<stdio.h>
- #include<stdlib.h>
- void selection_sort(int arr[], int len) {//自訂函數由大而小排序
- int i, j, temp;
- for (i = 0; i < len - 1; i++)
- for (j = i+1; j < len; j++)
- if (arr[i] < arr[j ]) {
- temp = arr[j];
- arr[j] = arr[i];
- arr[i] = temp;
- }
- }
- int main() {
- int n;
- printf("Enter array length:");
- scanf("%d",&n);
- int arr[n] ;
- for(int i=0;i<n;i++)
- scanf("%d",&arr[i]);
- //int len = (int) sizeof(arr) / sizeof(*arr);//陣列的大小
- selection_sort(arr, n);//呼叫函數由大而小排序
- int i;
- int r=1;//最大數的r值設定為1
- for (i = 1; i < n; i++){//從第2大數開始拜訪
- r++;//每拜訪一個,r就加1
- if(arr[i]==arr[i-1])//如果該數重覆出現
- r--;//r就不要加1
- if(r==3){//如果r值是3
- printf("The result is %d. ", arr[i]);//找到第3大數
- break;//離開迴圈
- }
- }
- if(r<3)//如果跑完迴圈,r值小於3,表示沒有第3大數
- printf("The result is %d. ", arr[0]);//輸出最大數
- return 0;
- }
複製代碼 不用排序法寫- #include <stdio.h>
- #include <stdlib.h>
- int main(){
- int n,i,c,t,first,second,third;
- printf("Enter array length:");
- scanf("%d",&n);
- int a[n];
- for(i=0; i<n; i++){
- scanf("%d",&a[i]);
- }
- first=second=third=0;
- for(i=0; i<n; i++) //一個個數字拿出來看
- {
- c = a[i]; //放在c方便把被超越的數字往下比
- if(c > first) //比最大的數大,就跟最大的數交換
- {
- t = first;
- first = c;
- c = t;
- }
- if(c == first) //重複的數就丟掉
- c = 0;
- if(c > second) //比第二大的數大,就跟第二大的數交換
- {
- t = second;
- second = c;
- c = t;
- }
- if(c == second) //重複的數就丟掉
- c = 0;
- if(c > third) //比第三大的數大,就跟第三大的數交換
- {
- t = third;
- third = c;
- c = t;
- }
- }
- if(third > 0) //有第三大的數就印出第三大的數
- printf("The result is %d.",third);
- else //沒有第三大的數就印出最大的數
- printf("The result is %d.",first);
- return 0;
- }
複製代碼 排序法應該還是比較慢,因為排序時,必須跑兩層迴圈。
排序的程式優點是可以用來解決複雜問題。
不排序的寫法只適用於簡單演算法的程式。太複雜就很難實作了。 |