天天看點

啊哈!算法第一章第二節---冒泡排序

冒泡排序冒泡排序的基本思想是:每次比較相鄰兩個元素的大小,如果順序錯誤就交換位置。

比如說有5個數12 35 99 18 76,要從大到小排序。是以越小的越靠後。

首先比較第1位和第2位的大小。由于12小于35,是以他們兩個交換位置。交換後:35 12 99 18 76.

然後比較第2位和第3位的大小。由于12小于99,是以他們兩個交換位置。交換後:35 99 12 18 76.

然後重複上述步驟,比較第3位和第4位,第4位和第5位。四次比較後5個數的順序是:35 99 18 76 12.這樣我們就把最小的一個數歸位了。每将一個數歸位我們将其稱為‘一趟’。下面就是重複上面的過程,将第二小的數歸位,第三小的數歸位,這樣來到了第四趟。雖然對于這五個數已經排好位置,但是這隻是巧合,換一下資料就不一定了。

通過上面的例子,發現冒泡排序的原理是:每趟将一個數歸位。即第一趟隻能将第五位上的數歸位,第二趟隻能将倒數第二位上的數歸位,第三趟将第三位上的數歸位,而在前面還有兩個位置上的書沒有歸位,還需要進行第四趟。

第四趟隻需比較第一位和第二位的數,這樣不僅第二位确定了,第一位也确定了。

綜上所述:如果有n個數需要排序,隻需将n-1個數歸位,也就是要進行n-1趟操作。每一趟都需要從第一位開始進行相鄰兩個數的比較,根據要求(從大到小還是從小到大)來判斷位置是否正确,不正确就換位。直到最後一個尚未歸位的數。注意,已經歸位的數無需再次進行比較。

看一下代碼:

#include <stdio.h>
int main(){
    int n,a[100],i,j,temp; 
    scanf("%d",&n);
    for(i=0;i<n;i++)
        scanf("%d",&a[i]);
    for(i=0;i<n-1;i++)  //隻需進行n-1趟比較
        for(j=0;j<n-i-1;j++) //每次都從第一位開始比較,已歸位不用再比較
            if(a[j]<a[j+1]){
                temp=a[j];  //從大到小排序,小的數排在後面
                a[j]=a[j+1];
                a[j+1]=temp;
            }
    for(i=0;i<n;i++)
        printf("%d",a[i]); //輸出結果
    return 0;
}      

用這種方法可以彌補上一節的問題,加一個結構體。

1 #include <stdio.h>
 2 struct student{
 3     char name[21];
 4     int score;
 5 }; //存放學生姓名和分數
 6 int main(){
 7     struct student a[100],temp;
 8     int i,j,n;
 9     scanf("%d",&n);
10     for(i=0;i<n;i++)
11         scanf("%s %d",a[i].name,&a[i].score);
12     for(i=0;i<n-1;i++)
13         for(j=0;j<n-i-1;j++)
14             if(a[j].score<a[j+1].score){ //從高到低排序,比較分數
15                 temp=a[j];
16                 a[j]=a[j+1];
17                 a[j+1]=temp;
18             }
19     for(i=0;i<n;i++) //輸出人名
20         printf("%s\n",a[i].name);
21     return 0;
22 }      

冒泡排序的核心是雙重嵌套循環.

轉載于:https://www.cnblogs.com/Aimee-S/p/6098679.html