排序5 交換排序(氣泡排序)

2021-06-25 23:26:46 字數 1495 閱讀 9479

插入排序概括起來,就是把序列分為有序與無序兩部分,每趟排序從無序部分選取元素,並通過各種手段在有序部分尋找合適的插入位置,把該元素放進該位置,從而達到排序的目的。而接下來介紹的交換排序,則是通過元素間的比較與交換操作來完成排序的。下面讓我們看看最簡單也是最經典的交換排序——氣泡排序。

以序列:49、38、65、97、76、13、27、

49為例。第1趟排序時,要處理整個序列。從第1個元素49開始,讓它跟第2個元素38對比,49>38,則49與38的位置交換,得:38、49、65、97、76、13、27、

49。接著,讓現在序列的第2個與第3個元素比較,49<65,則不需要交換它們的位置。然後,讓現在序列的第3個與第4個元素比較,65<97,同樣不需要交換它們的位置。接下來便是97與76相比,97>76,則兩者就要交換位置了,得:38、49、65、76、97、13、27、

49。跟著是97>13,同樣需要交換兩者位置,得:38、49、65、76、13、97、27、

49。再繼續,將會出現97>27,交換兩者位置得:38、49、65、76、13、27、97、

49。最後來到97>

49,也交換兩者位置,得:38、49、65、76、13、27、

49、97。至此,第1趟排序結束。大家可發現,序列中最大的元素97被放到序列最尾端,因此,第2趟排序則只處理序列的第1個到第7個元素(初始序列共8個元素)。處理的過程與上述道理完全一致,處理完後,這個處理部分中最大的的元素(也即完整序列的第2大元素)將被放到這7個元素所在部分的最尾端(即整個序列的倒數第2個位置),得:38、49、65、13、27、

49、76、97。此後第 i 趟排序只需要處理整個初始序列的第1個到第8-i+1個元素,處理過程與上述一致,每趟處理完,這幾個元素中最大的將被放到這幾個元素所在部分的最尾端。直到第7趟(即最後一趟,僅剩下頭兩個元素)也被處理完為止。不過,需要注意的是:比較過程中可能會出現49=

49的情況,此時也不應該交換兩者位置,以保證穩定排序。最後得到:13、27、38、49、

49、65、76、97。

實際上,對於n個元素的序列而言,氣泡排序最終並不總是需要像如上介紹那樣,進行到最多的第n-1趟,只要中途某趟排序過程中沒有發生元素交換位置的操作,即可保證整個序列已經有序,不需要再處理下去了。

由上文的描述可知,氣泡排序是穩定排序,**如下:

void bubblesort(int list,int length)

}if(!flag)

break;

}}

設序列元素個數為n。氣泡排序中,隨元素個數變化而改變次數的操作主要是元素的比較與交換操作,且一邊比較一邊交換,比較次數總不少於交換次數。所以,其時間複雜度的分析只需要看元素比較次數。最好情況下,序列完全順序,此時僅需進行1趟排序,其要進行n-1次元素的比較;最壞情況時,序列完全逆序,此時需要n-1趟排序,第 i 趟需要比較元素n-i 次,則總比較次數為:1+2+……+n-1。綜上所述,氣泡排序的時間複雜度為o(n2

)。由於氣泡排序過程中沒有使用隨元素個數變化而改變量量的輔助儲存空間,則空間複雜度為o(1)。

交換排序 氣泡排序

交換排序 兩兩比較待排序記錄的關鍵碼,若是逆序,則交換,直到無逆序。其中最簡單的交換排序是 氣泡排序。氣泡排序 bubble sort,也叫起泡排序 不斷地比較相鄰的記錄,若是不滿足排序要求,則交換。交換時,可從前向後,也可從後向前。看乙個從前向後的排序過程 原序列 12 3 45 33 6 下標 ...

氣泡排序 交換排序

最壞情況下,直接插入排序時間複雜度為 n 最小時間代價為 n 平均時間代價為 n 附加儲存空間 乙個儲存單位 穩定性 穩定 原址性 是 緊緻性 乙個比較,三個賦值操作 特點 對於基本有序,或偶爾有幾個在有序位置附近時,效率高,只有直接插入排序和它達到一樣的效果 整體效果不如直接插入排序,因為,直接插...

交換排序 氣泡排序

1.原理 從小到大排序 存在10個不同大小的氣泡,由底至上地把較少的氣泡逐步地向上公升,這樣經過遍歷一次後,最小的氣泡就會被上公升到頂 下標為0 然後再從底至上地這樣公升,迴圈直至十個氣泡大小有序。在 氣泡排序中,最重要的思想是兩兩比較,將兩者較少的公升上去 氣泡排序最壞情況的時間複雜度是o n 2...