插入排序複雜度為什麼不是nlog n

2021-07-25 13:07:57 字數 717 閱讀 2880

插入排序是一種很基本的排序,其複雜度為o(

n2) ,在大一學程式設計時沒有多想,為什麼不能利用二分查詢改進為o(

nlogn)

呢 ?

我們都知道插入排序就是在已有的序列上不斷地插入新的元素,我們都知道二分查詢的時間複雜度是o(

logn

) ,二分查詢的條件就是序列必須是有序的。而剛好可以用在插入排序的過程中使用,這樣

n 個元素的排序複雜度就是

nlogn了?

如上圖,a為原始序列,b為已排序,假設我們進行到c出,通過二分查詢找到下乙個要插入的元素位置,確實可以在o(

logn

) 的時間內完成。但是有個前提,如果我們要在對數時間內完成查詢,那麼前面已排序的序列需要滿足call-by-rank,也就是說能夠從下標讀取,我們常用的儲存方式如陣列,就可以。但是問題來了,如果我們將數插入有序序列,那麼該元素後面的數均需要往後移動乙個單位,如果運氣不好,這是最小的乙個數,那麼子串行所有元素都要往後移動,這個操作複雜度為o(

logn

) .所以其實並不能減少複雜度。

你可能會問:如果用鍊錶儲存已排序的序列,在插入時不就是常數複雜度嗎?但是此時就不能用二分查詢了,而在鍊錶中找到有插入位置,仍然需要o(

n)複雜度。所以依然不能降低插入排序複雜度。

插入排序演算法 時間複雜度

1.插入排序演算法 void sortt int a,int length 插入排序演算法 a j 1 temp 2.演算法的時間複雜度 我們假設計算機執行一行基礎 需要執行一次運算。int afunc void 那麼上面這個方法需要執行 2 次運算 int afunc int n for int ...

排序演算法 插入排序的時間複雜度分析

插入排序的原理是,將陣列分為已排序區間和未排序區間兩部分,從未排序區間中依次取元素跟已排序區間的元素一一對比,找到適合插入的位置。拿陣列 4,5,6,1,3,2 來舉例,如圖所示是排序的 過程。這個過程比上邊的原理詳細的多,本以為可以按照原理來寫出插入排序的 嘗試了幾次發現原理的資訊量並不足以寫出來...

氣泡排序 選擇排序 插入排序演算法及時間複雜度詳解

流程 把0到n個元素中的最大值放在n位置 把0到n 1個元素中的最大值放在n 1位置 把0到n 2個元素中的最大值放在n 2位置 時間複雜度 嚴格的o n2 的演算法 即使資料已經排好序,還要全部按照程式流程比較 交換一遍,所以稱為嚴格o n2 氣泡排序演算法 defbubbling sort ls...