排序實現與分析 插排

2021-10-24 10:28:48 字數 2367 閱讀 7363

思想

插入怕排序是一種簡單的排序方法,他的基本操作是將乙個資料插入到已有序的序列中,從而得到序列數加一的新的序列

插入排序中,我們先將最初始的有序序列數定為第乙個數字,即在下列資料中為1,從第二個開始,當前有序列為「1」

5和有序序列從頭開始比較,發現5應該在1的後邊,所以新的有序序列為「1,5」

然後第三個數字3,和有序序列從頭開始比較,發現3應該在1後邊,所以我們把1後邊的資料後移騰開位置,將3插入進來,此時有序序列為「1,3,5」

第四個數字6,比較後找到位置,插入到5之後,新的序列變為「1,3,5,6」

第五個數字4,找到位置,插入到3後,3原本後邊的資料後移,新序列為「1,3,4,5,6」

上述過程中我們發現,大概步驟分為,1.找到插入位置2.移動資料3.插入資料,所以實現如下

void

insertsort

(int

*arr,

int size)

for(

int k = i -

1;k >= j;

--k)

//將大於待排數字以及之後的資料後移

arr[j]

= tmp;

//代排數字插入

}}

時間複雜度與空間複雜度

分析空間複雜度o(1),時間複雜度為o(n2),但是再仔細分析後發現,此排序在資料本身有序的情況下時間複雜度,還是o(n2),排序分析其實不該如此,在資料本身有序時候,時間複雜度應該退化為o(n),其關鍵在於我們在有序列中尋找插入位置的實現

如上圖,當3要在有序列「1,2」中尋找合適插入位置,若是按照上述**從頭開始尋找,我們得從1開始找,實際並不需要如此,因為有序列已經有序,我們只需從最後乙個開始比較,遇到合適位置插入即可,3從2開始倒序尋找,發現2之後就是合適位置,直接插入即可,所以我們的尋找位置實現只需要從有序列最後乙個往前找即可,插排中,這算是乙個容易踩到的坑。

修改後我們的實現如下(還做了一些小小的優化)

void

insertsort

(int

*arr,

int size)

arr[j +1]

= tmp;

//無論如何,迴圈結束,找到有效位置插入

}}

在此**中,我們不光將尋找方式修改,並且將後移資料操作合併至尋找位置之中,因為第乙個小於等於待排資料的位置的下乙個才是待排資料的有效位置,如果沒找到該位置之前,只要遇到大於待排資料的值,早晚我們都要後移他,所以我們一發現就移動,就不需要後續做其他的處理,實現就變成了,遇到大的數字,後移,遇到第乙個小於等於的數字,即找到位置並跳出迴圈,然後插入即可。當前實現,在序列有序的情況下,時間複雜度退化為o(n),空間複雜度還是o(1)。

穩定性

穩定性:序列「3,5,3『 」,在排序後為「3,3』,5」即3,3『沒有交換,則為穩定,在此排序中我們的條件判斷是「 if(arr[j] <= tmp) 」,當3』進行插入時,遇到3的處理時跳出迴圈,5後移,所以3『會插入到3的後面,所以穩定,有人會發現,如果我們把該條件判斷改為「 if(arr[j] < tmp) 」,3『就會在3的前邊,就不穩定了,所以要注意的一點就是:穩定性時針對演算法本身,並不針對某一次實現,這裡演算法本事是穩定的,但是因為實現問題,使得他不穩定,不能說演算法本事是不穩定的。所以更好的乙個判斷方法就是看演算法本身的思想,有沒有進行跳躍式的交換資料,如果每次交換我們都是相鄰的兩個數字進行交換,那麼穩定,跳過有交換是跳過若干個資料進行交換,我們不能確定跳過了什麼資料,所以就是不穩定的。插排中,我們的待排資料在和有序資料倒序比較時都是,我與你比較,你比我大,我就在你前邊,往前走乙個,下乙個資料,我比你大,我兩交換我在**前邊,都是相鄰交換,故是穩定的。

排序實現與分析 快排

描述 快速排序,是乙個很重要的排序演算法,當然其平均效能也比較高,他的思想我借鑑紀磊在啊哈演算法中的形容來描述。在快排中,我們把待排序資料 如上圖 中的第乙個資料拿出來,稱他為基準,就是拿接下來的數字都跟他進行比較,如下圖所示,我們假設有兩個炮兵 此處紅五角星標識 乙個在資料的最左邊,乙個在資料的最...

C 實現各種排序 快排 插排 冒泡

1 插入排序 插入排序 主要思想 將陣列中的第乙個數認為是有序排列,剩下的n 1個數與第乙個數比較,再進行排序 有兩層迴圈,第一層控制排序的趟數,第二層控制每一趟比較的個數 include using namespace std int main for int i 0 i 10 i cin a i...

排序 上 插排 希爾 堆排

給每個新增的數在已有的數列中找到合適的位置,然後插入進去 例如乙個由小到大的排序 原陣列為 4,5,2,9,3,6,8,7 現在我們有了乙個陣列,我們可以假裝現在排過序的只有第乙個數,也就是說已有序列是第乙個數 i和j是下標,key代表當前要插入的數,j代表當前已經插入到了第幾個數,i是動態的用來與...