這個名詞的由來很好理解,一般河水中的冒泡,水底剛冒出來的時候是比較小的,隨著慢慢向水面浮起會逐漸增大,這物理規律我不作過多解釋,大家只需要了解即可。
冒泡演算法的運作規律如下:
①、比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。
②、對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數(也就是第一波冒泡完成)。
③、針對所有的元素重複以上的步驟,除了最後乙個。
④、持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
package com.ys.sort;
//氣泡排序
public class bubblesort
for(int i=length;i>0;i--)
}if(flag == true)
} return array;
}}
氣泡排序效能分析:假設參與比較的陣列元素個數為 n,則第一輪排序有 n-1 次比較,第二輪有 n-2 次,如此類推,這種序列的求和公式為:
(n-1)+(n-2)+...+1 = n*(n-1)/2
當 n 的值很大時,演算法比較次數約為 n2/2次比較,忽略減1。
假設資料是隨機的,那麼每次比較可能要交換位置,可能不會交換,假設概率為50%,那麼交換次數為 n2/4。不過如果是最壞的情況,初始資料是逆序的,那麼每次比較都要交換位置。
交換和比較次數都和n2 成正比。由於常數不算大 o 表示法中,忽略 2 和 4,那麼氣泡排序執行都需要 o(n2) 時間級別。
其實無論何時,只要看見乙個迴圈巢狀在另乙個迴圈中,我們都可以懷疑這個演算法的執行時間為 o(n2)級,外層迴圈執行 n 次,內層迴圈對每一次外層迴圈都執行n次(或者幾分之n次)。這就意味著大約需要執行n2次某個基本操作。
選擇排序是每一次從待排序的資料元素中選出最小的乙個元素,存放在序列的起始位置,直到全部待排序的資料元素排完。
分為三步:
①、從待排序序列中,找到關鍵字最小的元素
②、如果最小元素不是待排序序列的第乙個元素,將其和第乙個元素互換
③、從餘下的 n - 1 個元素中,找出關鍵字最小的元素,重複(1)、(2)步,直到排序結束
package com.ys.sort;
//選擇排序
public class choicesort
array[j] = temp;}}
} return array;
}}
插入排序效能分析:在第一輪排序中,它最多比較一次,第二輪最多比較兩次,一次類推,第n輪,最多比較n-1次。因此有 1+2+3+...+n-1 = n*(n-1)/2。
假設在每一輪排序發現插入點時,平均只有全體資料項的一半真的進行了比較,我們除以2得到:n*(n-1)/4。用大o表示法大致需要需要 o(n2) 時間級別。
複製的次數大致等於比較的次數,但是一次複製與一次交換的時間耗時不同,所以相對於隨機資料,插入排序比冒泡快一倍,比選擇排序略快。
這裡需要注意的是,如果要進行逆序排列,那麼每次比較和移動都會進行,這時候並不會比氣泡排序快。
Java 資料結構6 插入,選擇,氣泡排序演算法
插入排序 直接插入排序基本思想是每一步將乙個待排序的記錄,插入到前面已經排好序的有序序列中去,直到插完所有元素為止。private static void insertionsort int array 然後將其放到找到的位置上 array j temp for int i 0 i array.le...
資料結構 排序總結 冒泡 插入 選擇 歸併
在我們看到,無論是氣泡排序,插入排序或者是選擇排序,時間複雜度都可能是是o n 2 為什麼這三種排序時間複雜度都有可能是n 2而二路歸併是o nlog n 讓我們先看看前三種排序方法 通過以上排序方式,我們都不難發現,這些排序其實是在做兩種事情,乙個是比較,乙個是按照比較的結果做出位置的變換.其中位...
資料結構學習(冒泡 選擇 插入 快速排
coding utf 8 資料結構排序 函式氣泡排序 引數alist 被排序的列表 def bubblesort alist for num in range len alist 1,0,1 for i in range num if alist i alist i 1 進行當前位置和下乙個位置的交...