對于學習算法的同學而言,估計第一個接觸的排序算法就是冒泡。其實冒泡算法的本質就是交換,鄰居比較之后不停的交換。
舉個例子#
現有一數組a,里面有5個元素。a[0]=3,a[1]=4,a[2]=1,a[3]=5,a[4]=2.然后我們希望按照從小到大的順序排列,我們可以分析一下冒泡排序的過程:
第一遍:
- a[0]<a[1] 不改變 3,4,1,5,2
- a[1]>a[2] 這里要交換一下a[1]與a[2]的位置。結果是:3,1,4,5,2
- a[2]<a[3] 不改變 3,1,4,5,2
- 4.a[3]>a[4] 交換一下a[3]與a[4]的位置。排序后的結果是 3,1,4,2,5
第二遍:
我們從第一遍的可以看出,最大值已經被篩選出來,并且在最右側。然后我們在第二遍的執行的時候就相當于比較前面的四個元素就可以了。
- a[0]>a[1] 交換位置 1,3,4,2,5
- a[1]<a[2] 不變化
- a[2]>a[3] 交換位置 1,3,2,4,5
第三遍
從第二遍的執行結果可以看書,把4放到了最右側,所以第三遍僅需要比較前面的三個元素就可以了
- a[0]<a[1]不變化
- a[1]>a[2] 交換位置 1,2,3,4,5
第四遍
a[0]<a[1] 不變化 最終的排序的結果已經得出。
我們從上面的步驟可以看書,冒泡排序的本質就是不停的交換。說了那么多原理,我們用代碼來實現一下
實現#
#include <stdio.h>
int main()
{
int i,j,temp,a[5]={3,4,1,5,2};
for(i=1;i<=4;i++)
{
for(j=0;j<5-i;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=a[j];
}
}
}
for(i=0;i<5;i++)
{
printf("%d",a[i]);
}
return 0;
}
輸出的結果也是 1,2,3,4,5
這只是冒泡排序的一種方法,后買幾天我們來講其他的方法。