經典排序演算法之桶排序 氣泡排序和選擇排序

2021-08-23 14:10:21 字數 2526 閱讀 5762

桶排序是將待排序的資料扔到按順序排列的桶裡,如下圖:

其中每個桶都有按順序的編號(桶就是陣列,編號是陣列的下標),將每個數放到編號與之對應的桶裡,然後再將桶裡的數依次拿出來便排號了序。缺點:如果需要對100、2、0進行排序,則需要建立乙個大小為101(下標從0開始,見上圖)的陣列,造成了嚴重的空間浪費。

時間複雜度:

對於n個待排資料,m個桶

平均時間複雜度:o(n+n*logn-n*logm)

最好情況下的時間複雜度:o(n),當n=m時,即極限情況下每個桶只有乙個資料時。

如果相對於同樣的n,桶數量m越大,其效率越高,最好是o(n)。當然桶排序的空間複雜度為o(n+m),如果輸入資料非常龐大,而桶的數量也非常多,則空間代價無疑是昂貴的。此外,桶排序是穩定的。

示例**:

public class bucketsort ;

bucketsort(arr); }

static void bucketsort(int arr)

} //建立桶

int bucket = new int[max + 1];

//將資料放入桶

for (int i = 0; i < arr.length; i++)

//輸出桶裡的資料

for (int i = 0; i < bucket.length; i++)

} }}

氣泡排序是比較相鄰兩個元素的大小,將大的(或小的),向後移動。

例如,我們需要對3,6,4,2,4進行排序(由小到大),則氣泡排序過程如下:

第一次迴圈:

3,6,4,2,4      第一次比較:3和6比較,3小於6,不移動,結果:3,6,4,2,4

第二次比較:6和4比較,6大於4,將6後移,結果:3,4,6,2,4

第三次比較:6和2比較,6大於2,將6後移,結果:3,4,2,6,4

第四次比較:6和4比較,6大於4,將6後移,結果:3,4,2,4,6

第二次迴圈:

3,4,2,4,6      第一次比較:2和4比較,3小於4,不移動,結果:3,4,2,4,6

第二次比較:4和2比較,4大於2,將4後移,結果:3,2,4,4,6

第三次比較:4和4比較,4等於4,不移動,結果:3,2,4,4,6

第三次迴圈:

3,2,4,4,6     第一次比較:3和2比較,3大於2,將3後移,結果:2,3,4,4,6

第二次比較:3和4比較,3小於4,不移動,結果:2,3,4,4,6

第四次迴圈:

2,3,4,4,6      第一次比較:2和3比較,2小於3,不移動,結果:2,3,4,4,6

排序完畢。

之所以稱之為氣泡排序,是因為每次迴圈後都找出了最大(或最小)的元素向後移,就像水中的氣泡一樣,如圖:

看影象不像是冒泡呢?

時間複雜度(執行起來效率最低的):若待排序資料的初始狀態是正序的,一趟掃瞄即可完成排序。此時時間複雜度為

示例**:

public class bubblesort ;

bubblesort(arr); }

static void bubblesort(int arr)

}} for(int a : arr)

}}

選擇排序是每一次從待排序的資料中選出最大(或最小)的乙個元素,存放在未排序資料的後端(或前端)位置,直到全部待排序的資料元素排完。 其和氣泡排序類似,氣泡排序是兩兩比較交換,而此方法是先找出最大(或最小)值後再與序列的後端(或前端)進行交換,如圖(別說這個圖和氣泡排序的一樣哈,看第一次迴圈後的是不一樣的):

時間複雜度(優於氣泡排序):最好和最壞情況都是

示例**:

public class selectionsort ;

selesctionsort(arr); }

static void selesctionsort(int arr)

}//將最大元素放到每趟未排序元素的最後

temp = arr[arr.length - i - 1];

arr[arr.length - i - 1] = arr[maxindex];

arr[maxindex] = temp;

} for (int i = 0; i < arr.length; i++) }

}

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

好記性不如爛筆頭。氣泡排序屬於交換排序,交換排序的基本思想是 兩兩比較待排序記錄的關鍵字,當兩個記錄的次序相反時即進行交換,直到沒有反序的記錄為止。include using namespace std void printpro int input,int len void swap int fi...

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

int a 對於上面的乙個陣列,氣泡排序的原理是 依次比較相鄰元素的大小,前乙個元素若比後乙個元素大,則交換兩個元素的位置,給人的感覺是大的元素像氣泡一樣往上冒,也可以把小的元素往上冒。比較過程如下 最大值向上冒 陣列初始狀態 第一次比較後 5不比7大不交換位置 第二次比較後 7和3比較,交換位置 ...

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

氣泡排序很經典了,有人比喻過像是排序演算法中的hello world,很貼切。演算法的基本思想是每次都需要兩兩比較大小。氣泡排序演算法的過程如下 從前往後 1 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。2 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應...