冒泡排序冒泡排序的基本思想是:每次比較相鄰兩個元素的大小,如果順序錯誤就交換位置。
比如說有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