1. 程式人生 > >氣泡排序演算法、時間複雜度和穩定性

氣泡排序演算法、時間複雜度和穩定性

氣泡排序

氣泡排序一般是我們學習排序演算法時第一個接觸的演算法,下面來介紹一下氣泡排序。

演算法原理

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

演算法分析

排序的思想就是每遍歷一次把最大的元素放到最後。

通俗的講,氣泡排序的原理就是:

先開啟第一輪排序將第一、第二個元素進行比較,大的元素放在第二個元素位置上,然後再拿第二個元素和第三個元素進行比較,直到倒數第二個元素和最後一個元素相比較,將大的元素放在最後一個元素位置上,這樣就實現了最大的元素被排在了最後。

再開啟第二輪排序,和第一輪排序規則一樣從第一個元素到倒數第二個元素進行一一比較,將第二大的元素放在倒數第二個元素的位置上。

重複上面的排序規則,直到沒有數字需要比較為止。

程式碼實現

/**
 * @Title: bubbleSort
 * @Description: 氣泡排序
 * @param: array
 */
public static void bubbleSort(int[] array) {
    int n = array.length;
    for (int i = 0; i < n - 1; i++) {
        //在這裡j不需要遍歷到n-1了,因為n-1-i~n-1之間的元素已經排好序了,不需要再比較
for (int j = 0; j < n - 1 - i; j++) { //將最大元素移動到陣列末尾 if (array[j] > array[j + 1]) { swap(array, j, j + 1); } } } } /** * @Title: swap * @Description: 交換陣列array中下標為i和j的元素 * @param: array * @param: i * @param: j */ private
static void swap(int[] array, int i, int j) { array[i] = array[i] + array[j]; array[j] = array[i] - array[j]; array[i] = array[i] - array[j]; }

時間複雜度和演算法穩定性

從程式碼中可以看出一共遍歷了n-1 + n-2 + … + 2 + 1 = n * (n-1) / 2 = 0.5 * n ^ 2 - 0.5 * n,那麼時間複雜度是O(N^2)。

因為array[j]==array[j+1]的時候,我們可以不移動array[i]和array[j],所以氣泡排序是穩定的。

喜歡這篇文章的朋友,歡迎長按下圖關注公眾號lebronchen,第一時間收到更新內容。
掃碼關注