面試 用Java玩轉氣泡排序

2021-08-28 06:17:40 字數 2093 閱讀 1902

雖然在我們android開發中,很少涉及到排序演算法,因為基本官方都幫我們封裝好了,但排序演算法也是非常重要的,在面試中歸併排序快速排序一直未高頻考點,但在學習他們之前,我們必須得把三大基礎演算法學會,必經層層遞進,方得始終嘛。

氣泡排序恐怕是我們計算機課程上第乙個接觸到的排序演算法,也算是一種入門級的排序演算法。它的基本思想是:兩兩比較相鄰記錄的關鍵字,如果反序則交換,直到沒有反序的記錄為止。

氣泡排序演算法的原理:

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

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

針對所有的元素重複以上步驟,除了最後乙個。

持續每次對越來越少的元素重複上面的步驟,知道沒有任何一堆數字需要比較。

一次比較過程如下圖所示:

執行結果:1 2 3 4 5 6 7 8 9 

嚴格地講,上面的演算法並不是氣泡排序,因為他完全不符合兩兩相鄰比較。它更應該是最簡單的交換排序而已。它的思路是讓每乙個關鍵字,都和他後面的每乙個關鍵字比較,如果大則交換,這樣第一位置的關鍵字在一次迴圈後一定變成最小值。

我們不妨來看看正宗的氣泡排序演算法。

private static void bubblesort2(int arr),也就是說,除了第一和第二個關鍵字需要交換外,別的都應該是正常的順序,當i=1時,交換了2和1的位置,此時已經有序了,但是演算法依然不依不饒的將i=2到9以及每乙個內迴圈都執行一遍,儘管沒有交換資料,但之後的大量比較還是大大的多餘的。所以我們完全可以設定乙個標記位issort,當我們比較一次後,都沒有交換,則代表陣列已經有序了,此時直接退出迴圈即可。

既然思路已經確定,那麼**自然是很信手捏來了。

private static void bubblesort3(int arr)

}if (issort)

break;}}

public static void main(string args) ;

// bubblesort(arr);

// bubblesort2(arr);

bubblesort3(arr);

printarr(arr);

}

perfect的**,但氣泡排序在陣列長度比較大的時候,效率真的很低下,所以在實際開發中,我們也很少用這種演算法。

氣泡排序時間空間複雜度及演算法穩定性分析

對於長度為n的陣列,氣泡排序需要經過n(n-1)/2次比較,最壞的情況下,即陣列本身是倒序的情況下,要經過n(n-1)/2次交換,所以其:氣泡排序的演算法時間平均複雜度為o(n*n),空間複雜度為o(1);

可以想象一下:如果兩個相鄰的元素相等是不會進行交換操作的,也就是兩個相等元素的先後順序是不會改變的。如果兩個相等的元素沒有相鄰,那麼即使通過前面的兩兩交換把兩個元素相鄰起來,最終也不會交換它倆的位置,所以相同元素經過排序後書序並沒有改變。

所以氣泡排序是一種穩定排序演算法。所以氣泡排序是穩定排序。這也正是演算法穩定性的定義:

氣泡排序總結:

氣泡排序的演算法時間平均複雜度為o(n*n)。

空間複雜度為o(1)。

氣泡排序為穩定排序。

java 氣泡排序

氣泡排序 bubble sort 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。氣泡排序演算法的...

Java氣泡排序

氣泡排序 bubble sort 是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。這個演算法的名字由來是因為越小的元素會經由交換慢慢 浮 到數列的頂端。氣泡排序演算法的...

java 氣泡排序

氣泡排序 氣泡排序演算法的運作如下 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。在這一點,最後的元素應該會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較...