內部排序(2)——冒泡排序

它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。之所以叫冒泡排序,是因爲它每次排序時,對所排序的數據,排序掃描總是將最大的那個數從地下“冒”上來。冒泡排序效率不高,這是因爲它需要約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>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章