八大排序之氣泡排序和氣泡排序的優化

2021-10-05 17:55:36 字數 2340 閱讀 9690

一、氣泡排序的思想

氣泡排序是交換排序的一種。

氣泡排序顧名思義,類似於大石頭向下沉的問題,它的思想也就是大資料向後移,小資料向前移。

二、**氣泡排序

給定一組資料

[12 3 21 32 1 34 12 35 34 18]

1、第一趟排序

定義兩個變數i和j,j不斷自加。每次將j和j+1比較。如果,arr[j+1]>arr[j],就將j+1和j交換。直到j走到len-1的位置,第一趟排序結束。得到第一堂排序後的資料

第一趟排序將最大的元素35排到了最後,所以氣泡排序每次只能將乙個元素排序出來

2、第二趟排序

第二趟排序將i+1,j繼續從0的位置開始進行自加,重複第一趟排序。繼續交換,繼續排序,讓j走到len-1的位置,然後完成第二趟的排序。得到第二趟排序後的結果。

第二趟排序找到第二大的元素34。

剩下的排序過程和第一趟第二趟排序過程一樣,i在每趟的排序後進行++。

所以此排序的核心**就是每次控制j的邊界的問題

i控制每趟排序的個數,j = len - i -1

三、**實現氣泡排序

void

bubblesort

(int arr,

int len)}}

}

四、氣泡排序的優化從上面的操作來看,我們發現這樣只是兩兩元素進行了交換,並沒有體現出氣泡排序的特點。

現在我們假設待排序的關鍵字序列是[9,1,5,8,3,7,4,6,2],

當i=1時,變數j由8反向迴圈到1,逐個比較,將較小值交換到前面,直到最後找到最小值放置在了第1的位置。

當i=1、j=8 時,我們發現6>2,因此交換了它們的位置.

j=7時,4>2,所以交換…

直到j=2時,因為1<2,所以不交換。j=1 時,9>1,交換,最終得到最小值1放置第一的位置。

這樣在不斷迴圈的過程中,除了將關鍵字1放到第一的位置,我們還將關鍵字2從第九位置提到了第三的位置,這個演算法比前面的要有進步,在很多資料的排序過程中,這種差異會體現出來。圖中較小的數字如同氣泡般慢慢浮到上面,因此就將此演算法命名為冒泡演算法。如下圖所示:

這樣就體現出氣泡排序的特點,最小的資料會像水泡一樣慢慢浮上水面。

接著當i = 2時,變數j由8反向迴圈到2,逐個比較,再將關鍵字2交換到第二位置的同時,3和4也慢慢浮上來。

但是這樣的氣泡排序還是缺點的,比如我們給出這樣的一組待排序數列

[2 1 3 4 5 6 7 8 9]

也就是說除了第一和第二個關鍵字需要交換外,其他的資料是不用交換的,但上面的演算法還是將資料全部迴圈了一遍,這樣大大降低了演算法的效率。如圖所示:

只要這關鍵兩步,其他的迴圈都是多餘的。

優化一:

設定乙個flag標記一趟比較是否發生交換,如果沒有發生交換,則陣列已經有序

void

bubblesort1

(int arr,

int len)}if

(flag ==0)

}}

優化二:我們發現,每次排序前或排序後陣列的後面都有一部分已經有序,這時我們只要記下最後一次排下的陣列的下標下次排序的時候就可以只排序到此下標位置即可。定義乙個index來標記最後一次排序的位置

void

bubblesort2

(int arr,

int len)}if

(flag ==0)

index=index1;

//若排序過則將index置為最後一次交換的座標,若沒有則表示已經有序

}}

八大排序之氣泡排序

氣泡排序,穩定,平均與最壞時間複雜度為o n 2 最好為o n 空間複雜度為o 1 include using namespace std void bubblesort int numbers,const int length int main int length 0 cin length fo...

八大排序之氣泡排序

1 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。2 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。3 針對所有的元素重複以上的步驟,除了最後乙個。4 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。1.不管原始陣列是否...

八大排序之氣泡排序

思路 冒泡,即為在每次排序時,將此時陣列內最大的數移到此時的最後一位。第一步 確定有幾個數需要放到各自情況的最後一位,答案是陣列長度 1個數。第二步 確定第i次將此時的最大數排到此時的最後一位時,需要進行比較多少次,答案是陣列長度 1 i次。因為此時已經確定了i 1個數的位置 所以用兩層迴圈即可實現...