初級排序
高階排序
非比較排序
逆序對,是分析排序演算法的乙個重要知識點。既然評估排序演算法,就要知道如何去描述陣列的排序程式。
逆序對,陣列中兩個逆序元素的對數。
比如【1, 5, 3】,其中(5, 3)就是逆序的,所以這個陣列的逆序對為1。
那麼乙個陣列的最好逆序對為0,最壞逆序對為 n(n-1)/2。
因為逆序對是兩兩進行組合,所以每個元素能夠跟其他 n-1 元素配對,因為兩兩重複,所以除以2。
選擇排序
選擇陣列中最小值,將其放入陣列的最左邊。
放入陣列的方式,分為移動插入和一直交換相鄰元素。
可以發現,每進行一次相鄰交換,逆序對將會減一。
時間複雜度:每進行一次操作,需要比較(n-k)個元素,找到最小的元素。然後移動最小元素所在位置到前面。所以時間複雜度為n平方。
空間複雜度:無需其他空間。
插入排序
將陣列分為排序和未排序兩部分,每次從未排序部分選取乙個元素,按順序插入到已排序部分。
想象你打牌的時候,手上拿的是已排序的拍,每次抓牌的時候,都是把抓到的牌(未排序)按順序插入到手上已排序的牌中。
插入的策略,也是交換相鄰元素或者移動插入。每進行乙個相鄰交換,逆序對減一。
時間複雜度:選取未排序元素的時間為常數,所以需要確認將其插入到排序元素中的時間。(這是關鍵)之前說過,每交換相鄰元素,逆序對會減一,所以插入到排序元素的時間跟逆序對成正比。
所以,可以很容易得出,最壞時間複雜度為(n-1)n/2,平均時間複雜度為(n-1)n/4,最好時間複雜度為1
希爾排序
希爾排序,間隔抽樣子陣列,對子陣列完成排序。
為什麼叫初級排序呢
(《演算法》中將它們成為初級排序,也許是演算法思想比較簡單,時間複雜度比較高)
我們發現乙個特點,雖然思想是不一樣的,但實現中,基本上都是採用交換相鄰元素的特點來達到插入的目的。而且每次交換相鄰元素,都會使得逆序對減一。所以很自然,這些思想會和逆序對成正比。
快速排序
快速排序,是選取乙個元素,然後經過交換元素,保證選定元素的左邊都小於它,右邊元素都大於它。每次操作後,選定元素的位置就是排序後的位置。
在實際演算法中,我們可以看到,每交換元素的時候,逆序對減少的個數會大於等於1。這就是相較於初級演算法的提公升。
歸併排序
歸併排序,是分為多個子陣列,再合併的方法。(不贅述)
二叉堆排序
一般利用堆,實際實現是利用陣列的形式,進行維護top k的一種排序方法。
非比較排序
上面的方法,都是基於數與數的比較,來完成排序。而非比較排序,不需要比較數與數之間的關係。
你只要知道你前面有多少人,你就可以確定你的位置,進而排序。
計數排序
計數排序,是記錄每個位置上應該出現的數字,比如【1, 3, 4, 5】,我們就可以建立乙個陣列【1, 0, 1, 1, 1】,表示有1個1,0個2, 1個3, 1個4, 1個5。
計數排序適用於相對集中的資料排序,如果【1, 100】, 那我們就要建立100位的計數陣列。
基數排序
之前說了計數排序的弊端,那麼基數排序是用來解決這個問題的。基數排序,從個位,十位,百位入手,對於個位進行計數排序,因為個位可能出現的數字最多只有10個,也就是基數。【1, 100】就被分為百位、十位、個位,三個基數排序。
桶排序桶排序,可以大致理解位資料進行分塊,但不是像歸併排序那樣隨機分,而是有個相對順序的區間,就比如100-90, 90-80乙個桶,然後在桶內完成排序。
這種情況適用於資料相對多,而且資料大小分布相對均勻的情況下。
演算法 2 排序1 0
對於排序演算法執行效率的分析,我們一般會從這幾個方面來衡量 1.最好情況 最壞情況 平均情況時間複雜度 我們在分析排序演算法的時間複雜度時,要分別給出最好情況 最壞情況 平均情況下的時間複雜度。2.時間複雜度的係數 常數 低階 我們知道,時間複雜度反應的是資料規模n很大的時候的乙個增長趨勢,所以它表...
排序演算法 6 排序演算法總結
前面幾篇部落格分別羅列和總結了近期學習的幾種排序演算法,今天總結一下。排序演算法 概述 氣泡排序 選擇排序 排序演算法 直接插入排序 希爾排序 排序演算法 堆排序 排序演算法 快速排序 排序演算法 合併排序 計算的複雜度 依據排序資料量的大小 n 好的表現是o nlogn 最差表現為o n2 系統資...
演算法總結 一 排序演算法總結
1.輸入 n個數,a1,a2,an 2.輸出 n個數,a1 a2 an 使得a1 a2 an 1.in place sort 不占用額外記憶體或占用常數記憶體 插入排序 選擇排序 氣泡排序 堆排序 快速排序 out place sort 歸併排序 計數排序 基數排序 桶排序。2.穩定排序 插入排序 ...