它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。之所以叫冒泡排序,是因爲它每次排序時,對所排序的數據,排序掃描總是將最大的那個數從地下“冒”上來。冒泡排序效率不高,這是因爲它需要約n^2/2次比較,然而對一些小數來說,它的性能還是可以接受的。這個算法的名字由來是因爲越大的元素會經由交換慢慢“浮”到數列的頂端,故名。
排序時程序算法中非常有挑戰意義的。冒泡算法的選擇排序法從效率來說都不是很高,實際需要的排序時間也比較長,特別是在數據量很大得情況下更是耗費時間。
冒泡排序算法的步驟如下:
比較相鄰的元素。如果第一個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。
針對所有的元素重複以上的步驟。
持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較
示例:
#include<stdio.h>
int main()
{
int i,j,n,temp,a[20];
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=1;i<n;i++)
for(j=0;j<n-i;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;
}
時間複雜度O(n^2).
冒泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。所以,如果兩個元素相等,我想你是不會再無聊地把他們倆交換一下的;如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個相鄰起來,這時候也不會交換,所以相同元素的前後順序並沒有改變,所以冒泡排序是一種穩定排序算法。
優化一下:
設置一個標記flag,flag=0;表示沒有交換,flag=1;表示有交換。如果循環一趟都沒有交換,則表明排序已經完成。
<span style="font-size:18px;">#include<stdio.h>
int main()
{
int i,j,n,temp,a[20],flag=0;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
for(i=1;i<n;i++)
{
flag=0;
for(j=0;j<n-i;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
flag=1;
}
if(flag==0)
break;
}
for(i=0;i<n;i++)
printf("%d ",a[i]);
return 0;
}
</span>