經典排序演算法(1) 氣泡排序演算法詳解

2021-09-27 23:35:28 字數 1779 閱讀 6421

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

什麼是交換排序呢?

交換排序:兩兩比較待排序的關鍵字,並交換不滿足次序要求的那對數,直到整個表都滿足次序要求為止。

(1)基本思想

氣泡排序的基本思想就是:從無序序列頭部開始,進行兩兩比較,根據大小交換位置,直到最後將最大(小)的資料元素交換到了無序佇列的隊尾,從而成為有序序列的一部分;下一次繼續這個過程,直到所有資料元素都排好序。

演算法的核心在於每次通過兩兩比較交換位置,選出剩餘無序序列裡最大(小)的資料元素放到隊尾

2)執行過程

氣泡排序演算法的運作如下:

1、比較相鄰的元素。如果第乙個比第二個大(小),就交換他們兩個。

2、對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大(小)的數。

3、針對所有的元素重複以上的步驟,除了最後已經選出的元素(有序)。

4、持續每次對越來越少的元素(無序元素)重複上面的步驟,直到沒有任何一對數字需要比較,則序列最終有序。

int temp = 0; // 用來交換的臨時數

for(int i=0;ia[j+1])}}

for(int i=0;i若檔案的初始狀態是正序的,一趟掃瞄即可完成排序。所需的關鍵字比較次數 c 和記錄移動次數 m 均達到最小值:cmin = n - 1, mmin = 0。所以,氣泡排序最好時間複雜度為 o(n)。

若初始檔案是反序的,需要進行 n -1 趟排序。每趟排序要進行 n - i 次關鍵字的比較(1 ≤ i ≤ n - 1),且每次比較都必須移動記錄三次來達到交換記錄位置。在這種情況下,比較和移動次數均達到最大值:

cmax = n(n-1)/2 = o(n2)

mmax = 3n(n-1)/2 = o(n2)

氣泡排序的最壞時間複雜度為 o(n2)。因此,氣泡排序的平均時間複雜度為 o(n2)。

總結起來,其實就是一句話:當資料越接近正序時,氣泡排序效能越好。

氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交換也發生在這兩個元素之間。

所以相同元素的前後順序並沒有改變,所以氣泡排序是一種穩定排序演算法。

對氣泡排序常見的改進方法是加入標誌性變數 exchange,用於標誌某一趟排序過程中是否有資料交換。

如果進行某一趟排序時並沒有進行資料交換,則說明所有資料已經有序,可立即結束排序,避免不必要的比較過程。

public class bubblesort ;

int temp = 0; // 用來交換的臨時數

boolean bchange = false; // 交換標誌

//i--[0,a.length]:要遍歷的次數

for(int i=0;ia[j+1])

}// 如果標誌為false,說明本輪遍歷沒有交換,已經是有序數列,可以結束排序

借鑑:

經典排序演算法,氣泡排序

氣泡排序是本人在大一學習c語言的時候就已經學過了,最近這段時間想起來把比較經典的排序演算法拿來回顧一下,鞏固一下知識。氣泡排序的核心就是比較相鄰兩個數的大小,然後將小的 或者大的 放到前面去,經過一趟之後,就能把最小或者最大的放到最前面,第二趟排序的時候,第乙個數不參與排序,從第二個數開始,經過一趟...

經典排序演算法 氣泡排序

對列表的無序部分從頭至尾掃瞄一遍,掃瞄過程中通過不斷交換相鄰兩個元素,最終把最大 小 元素交換到列表末尾。首先比較第一和第二個數,把較大的放在第二位。比較第二個和第三個數,再把較大的數放在第三位。如此比較下去,直到比較完最後兩個數。這樣就把整個列表中最大的數交換到了末尾。上面三步只是完成了對列表無序...

經典排序演算法 氣泡排序

氣泡排序的原理是從第乙個數字開始,依次讓相鄰的兩個數字進行比較,按照從大到小或從小到大的順序進行交換 如果是公升序排列就把小的放前面,如果降序排列就把大的放前面 第一趟比較後,就把最大的的數字放在最後乙個位置 假設按照公升序排列 然後進行第二趟比較,依次進行相鄰數字比較,第二趟比較後次大的數字放在了...