07 排序之冒泡 插入 選擇

2021-10-25 13:51:28 字數 1532 閱讀 4316

排序演算法的執行效率

排序演算法的記憶體消耗

也就是空間複雜度,特別的,空間複雜度為o(1)的排序演算法也叫原地排序演算法

排序演算法的穩定性

如果待排序的序列中存在值相等的元素,經過排序之後,相等元素之間原有的先後順序不變。

演算法**

public static void sort(int array, int n)

}if (!ischange) break;

}}

分析:

氣泡排序是原地排序演算法,只用了常量級的空間

氣泡排序是穩定的排序演算法

時間複雜度:最好o(n) 最壞o(n2) 平均怎麼算?

有序度和逆序度

概念:有序度

有序元素對:a[i] <= a[j], 如果i < j
逆序度

逆序元素對:a[i] > a[j], 如果i < j
滿有序度為n*(n-1)/2

逆序度 = 滿有序度 - 有序度

由於每交換一次,有序度就加1,交換次數就和逆序度相對應

最壞情況下,初始有序度為0,要進行n*(n-1)/2次交換;最壞情況下,初始有序度為n*(n-1)/2,不需要交換,我們取個中間值n*(n-1)/4

也就是說,平均情況下,需要n*(n-1)/4次交換操作,比較操作肯定更多,而複雜度上限為o(n2),故平均時間複雜度就是o(n2)

// 插入排序,a表示陣列,n表示陣列大小

public void insertionsort(int a, int n) else

}a[j+1] = value; // 插入資料

}}

分析:

插入排序是原地演算法

插入排序是穩定演算法

時間複雜度分析 最好o(n) 最壞o(n2)

平均時間複雜度 陣列中插入乙個資料的平均時間複雜度為o(n),對插入排序來說,每次插入都相當於在陣列中插入乙個資料,執行n次操作,故平均時間複雜度為o(n2)

public static void selectsort(int array, int n) 

}}

選擇排序是原地排序演算法

選擇排序是不穩定演算法

最好時間複雜度o(n) 最壞時間複雜度o(n2) 平均時間複雜度o(n2)

氣泡排序的資料交換要比插入排序的資料移動要複雜,氣泡排序需要 3 個賦值操作,而插入排序只需要 1 個

我們把執行乙個賦值語句的時間粗略地計為單位時間(unit_time),然後分別用氣泡排序和插入排序對同乙個逆序度是 k 的陣列進行排序。用氣泡排序,需要 k 次交換操作,每次需要 3 個賦值語句,所以交換操作總耗時就是 3*k 單位時間。而插入排序中資料移動操作只需要 k 個單位時間。

氣泡排序中資料的交換操作:

if (a[j] > a[j+1])

插入排序中資料的移動操作:

if (a[j] > value) else

冒泡,插入,選擇排序

經典的排序演算法,此文章介紹三個 氣泡排序 它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。public void bubblesort int a while iswrap for int ...

排序演算法 插入 選擇 冒泡 快排 歸併

可以找一些帖子理解下幾類排序演算法或者聽下陳越姥姥在mooc上的資料結構 選擇類排序 交換類排序 歸併排序 基數排序 拓撲排序 從待排序的n個記錄中的第二個記錄開始,依次與前面的記錄比較並尋找插入的位置,每次外迴圈結束後,將當前的數插入到合適的位置。void sort insert int a,in...

冒泡 插入 選擇 快速排序

各位親 有時間可以去看看我的 金駿家居 店 買時說明在我的部落格看到有優惠哦 還有意外禮品贈送 真正的程式設計師 店 氣泡排序 每次找出最大或者最小的數放到序列的最後。插入排序 每一次查詢都把數放到已排序序列合適的位置。例子 4,3,2,1如數中的第乙個數肯定是有序的,從第二個數開始3小於4,放在已...