冒泡排序是個很經典的排序算法
小李學嵌入式C語言關於對冒泡排序的思考,這裏記錄一下;
冒泡排序最關鍵的還是輪數和交換次數的關係,其實經過分析可以得出最少的排序次數,和輪數,當然不同的寫法也可以實現,只是要麼輪數會多跑一趟,要麼是交換的次數會變多一些
這個圖片是個動畫版,老師給的我覺得對於理解交換還是很有幫助的,放上來大家一起欣賞這個圖明顯的是大的往後換是順序排序;
#include <stdio.h>
int main(void)
{
int a[10]={1,2,3,6,5,4,7,8,10,9};//初始化數組亂序
int t;
for(int i=0;i<10-1;i++)//冒泡排序的輪數控制0-8最多9次(n-1)
{
for(int j=0;j<10-1-i;j++)//冒泡排序的交換次序控制最多9次(n-1),最少1次
{
if(a[j]>a[j+1])//如果前面比後面的大則進行交換
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
} //實現順序排序
}
}
for(int i=0;i<10;i++)
printf("%d ",a[i]);//格式化輸出
return 0;
}
運行結果如圖
還有一種就是實現逆序排序
#include <stdio.h>
int main(void)
{
int a[10]={1,2,3,6,5,4,7,8,10,9};//初始化數組亂序
int t;
for(int i=0;i<10-1;i++)//冒泡排序的輪數控制0-8最多9次(n-1)
{
for(int j=0;j<10-1-i;j++)//冒泡排序的交換次序控制最多9次(n-1),最少1次
{
if(a[j]<a[j+1])//如果前面比後面的小則進行交換
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
} //實現逆序排序
}
}
for(int i=0;i<10;i++)
printf("%d ",a[i]);//格式化輸出
return 0;
}
運行結果如圖:
下面是一些思考
當我把輪數改大之後發現依然可以進行,但是爲了形成一個比較科學的學習和記憶我還是決定記住冒泡排序的最優寫法;i<n-1;i<n-1-j;
i和j都是從0開始變化,這樣交換的時候才能保證每個都可以進行,i控制的是冒泡的輪數,而j控制的是每次排序的交換的次數,因爲這個會隨着輪數的變大而變小,因爲隨着輪數的進行順序也在慢慢的變整齊,交換的次數和排序的輪數相加是恆等於n的;