算法与数据结构(冒泡排序,选择排序和插入排序的总结)
冒泡排序,選擇排序和插入排序的總結
在規模較小時,或者元素的有序性較高時,插入排序的時間復雜度可以接近 O(n) ,是上述三種排序里表現最好的
一、通過表格我們可以發現,冒泡排序的時間復雜度是要優于選擇排序的,但實際上選擇排序的平均效率要優于冒泡排序
冒泡排序的思想是不斷比較相鄰元素大小,如果逆序,就需要不斷的交換位置,也就是說在冒泡排序的一次子循環中,可能需要進行多次交換操作
選擇排序的思想是在未排序序列中找出最小值,添加到有序序列末端,并不斷重復。這種排序方式導致選擇排序無論如何都會進行n(n?1)2\frac{n(n-1)}{2}2n(n?1)? 次比較操作,但是在交換位置時,選擇排序只需要進行一步操作
也就是說,對于非優化的冒泡排序和選擇排序,他們都需要進行 nnn 次子循環。而在每一次子循環中,冒泡排序需要 nnn 次比較和多次數據交換,選擇排序需要 nnn 次比較和一次數據交換
所以選擇排序的實際效率一般會略高于冒泡排序
二、從字面上來看,冒泡排序和插入排序的時間復雜度是一樣的,但是插入排序的效率高于冒泡排序
要回答這個問題,首先要了解有序度
有序度是列表中有序元素對的個數,用數學關系表示就是
a[i]≤a[j],ifi<ja[i] \leq a[j], if \quad i < j a[i]≤a[j],ifi<j
例如,對于[2, 4, 3, 1, 5, 6]這個數組來說,有序元素對個數是 11,分別是:
(2,4)(2,3)(2,5)(2,6)
(4,5)(4,6)
(3,5)(3,6)
(1,5)(1,6)
(5,6)
對于一個倒序數組來說,有序度是 0; 對于一個完全有序數組來說,有序度是 \frac{n(n-1)}{2},在這里就是 15
逆序度的定義和有序度正好相反,因此我們可以得到一個公式
逆序度=滿有序度?有序度逆序度 = 滿有序度 - 有序度逆序度=滿有序度?有序度
我們排序的過程就是一個增加有序的,減少逆序度的過程,最后達到滿有序度,就說明排序完成了
對于冒泡排序來說,每交換一次,有序度+1, 因此總交換次數等于逆序度。對于包含 nnn 個數據的冒泡排序來說,最好的情況是逆序度為0,即不需要交換;最壞的情況是逆序度為 n(n?1)2\frac{n(n-1)}{2}2n(n?1)?。換句話說,平均情況下,冒泡排序需要 n(n?1)4\frac{n(n-1)}{4}4n(n?1)? 次交換操作
對于插入排序來說,每一次操作中后移元素的個數之和就等于逆序度,見下圖:
逆序度 = 10 = 3 + 3 + 4
再來回答問題,我們之前提到比較排序算法的時間復雜度有兩個因素:比較次數和交換次數
非優化的冒泡排序的比較次數一定是大于插入排序的,優化過后兩者比較次數不太好比較,但最大值都是 n(n?1)2\frac{n(n-1)}{2}2n(n?1)?
因為冒泡排序的交換次數等于逆序度,插入排序的元素移動次數(這里的元素后移其實也是靠交換賦值來實現的,但是形象上看更像是將元素向后移動了,也便于和冒泡排序區分,所以表述成移動次數)也等于逆序度。但是,從代碼實現來看,冒泡排序的交換操作要比插入排序的移動復雜
冒泡排序每交換一次,需要給三個變量賦值
int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp;而插入排序只需要一次,且插入排序的臨時變量只會在每一輪子循環中交換一次值
arr[pos+1] = arr[pos];因此,插入排序的實際效率是比冒泡排序要高的
相關章節
第一節 簡述
第二節 稀疏數組 Sparse Array
第三節 隊列 Queue
第四節 單鏈表 Single Linked List
第五節 雙向鏈表 Double Linked List
第六節 單向環形鏈表 Circular Linked List
第七節 棧 Stack
第八節 遞歸 Recursion
第九節 時間復雜度 Time Complexity
第十節 排序算法 Sort Algorithm
第十一節 冒泡排序 Bubble Sort
第十二節 選擇排序 Select Sort
第十三節 插入排序 Insertion Sort
第十四節 冒泡排序,選擇排序和插入排序的總結
第十五節 希爾排序 Shell’s Sort
第十六節 快速排序 Quick Sort
第十七節 歸并排序 Merge Sort
總結
以上是生活随笔為你收集整理的算法与数据结构(冒泡排序,选择排序和插入排序的总结)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法与数据结构(插入排序)
- 下一篇: 算法与数据结构(希尔排序)