插入排序 直接插入排序 希爾排序

2022-01-18 21:41:12 字數 1648 閱讀 8731

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 進行掃瞄。 

**:

static

void insertsort(listlist)

list[j + 1] = temp;

} }

時間複雜度

當資料正序時,執行效率最好,每次插入都不用移動前面的元素,時間複雜度為o(n)。 

當資料反序時,執行效率最差,每次插入都要前面的元素後移,時間複雜度為o(n2)

所以,資料越接近正序,直接插入排序的演算法效能越好。 

2.希爾(shell)排序

希爾排序的基本思想是:

把記錄按步長 gap分組,對每組記錄採用直接插入排序方法進行排序。

隨著步長逐漸減小,所分成的組包含的記錄越來越多,當步長的值減小到1時,整個資料合成為一組,構成一組有序記錄,則完成排序。

static

void 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...