1.直接插入排序
兩個陣列,有序陣列和無序陣列。
排序前:無序陣列裡面所有的值都是無序的,有序陣列沒有值
排序中:無序陣列中拿出乙個數,放到有序陣列當中,有序陣列拿到數,將其按照大小有序的插入到無序陣列中
排序後:無序陣列中沒有數,有序陣列中的數為有序的。
假設有一組無序序列 r0, r1, ... , rn-1。
(1) 我們先將這個序列中下標為 0 的元素視為元素個數為 1 的有序序列。
(2) 然後,我們要依次把 r1, r2, ... , rn-1 插入到這個有序序列中。所以,我們需要乙個外部迴圈,從下標 1 掃瞄到 n-1 。
(3) 接下來描述插入過程。假設這是要將 ri 插入到前面有序的序列中。由前面所述,我們可知,插入ri時,前 i-1 個數肯定已經是有序了。
所以我們需要將ri 和r0 ~ ri-1 進行比較,確定要插入的合適位置。這就需要乙個內部迴圈,我們一般是從後往前比較,即從下標 i-1 開始向 0 進行掃瞄。
**:
staticvoid insertsort(listlist)
list[j + 1] = temp;
} }
時間複雜度
當資料正序時,執行效率最好,每次插入都不用移動前面的元素,時間複雜度為o(n)。
當資料反序時,執行效率最差,每次插入都要前面的元素後移,時間複雜度為o(n2)。
所以,資料越接近正序,直接插入排序的演算法效能越好。
2.希爾(shell)排序
希爾排序的基本思想是:
把記錄按步長 gap分組,對每組記錄採用直接插入排序方法進行排序。
隨著步長逐漸減小,所分成的組包含的記錄越來越多,當步長的值減小到1時,整個資料合成為一組,構成一組有序記錄,則完成排序。
staticvoid shellsort(listlist)
list[j + step] =temp;
}step = step / 2
; // 減小增量
}}
直接插入排序和希爾排序的比較
直接插入排序是穩定的;而希爾排序是不穩定的。
直接插入排序更適合於原始記錄基本有序的集合。
希爾排序的比較次數和移動次數都要比直接插入排序少,當n越大時,效果越明顯。
在希爾排序中,增量序列gap的取法必須滿足:最後乙個步長必須是 1。
直接插入排序也適用於鏈式儲存結構;希爾排序不適用於鏈式結構。
插入排序(直接插入排序 希爾排序)
直接插入排序 基本思想 假設待排序的數存放在陣列arr 1.n 中。初始時,arr 1 自成1個有序區,無序區為arr 2.n 從i 2起直至i n為止,依次將arr i 插入當前的有序區arr 1.i 1 中,生成含n個記錄的有序區。演算法複雜度 對於具有n個記錄的檔案,要進行n 1次排序 各種狀...
插入排序 直接插入排序 希爾排序
一 直接插入排序 1.思想 直接排序法,可以分為兩個部分,一部分是有序的,一部分是無序的.從這個圖上,應該是能看清楚直接插入排序的思想了.將無序部分的第乙個與有序部分進行比較.從有序部分的後面向前面比較,然後不斷地挪動有序部分的資料的位置 static void insertsort listlis...
排序 插入排序(直接插入排序 希爾排序)
插入排序 insertion sort 的基本思想是 每次將乙個待排序的記錄,按其關鍵字大小插入到前面已經排好序的子檔案中的適當位置,直到全部記錄插入完成為止。本節介紹兩種插入排序方法 直接插入排序 和希爾排序。直接插入排序基本思想 1 基本思想 假設待排序的記錄存放在陣列r 1.n 中。初始時,r...