排序演算法詳解 2

2021-09-22 16:38:09 字數 1329 閱讀 8310

前面說的三種排序,氣泡排序、選擇排序、快速排序都是交換排序,通過交換元素的位置進行排序。下面說的兩種排序都是插入排序,分別是插入排序和希爾排序;

插入排序

插入排序的原理是:

將第乙個元素標記為已排序遍歷每個沒有排序過的元素

「提取」 元素 x

i = 最後排序過元素的指數 到 0 的遍歷如果現在排序過的元素 > 提取的元素將排序過的元素向右移一格

否則:插入提取的元素

下面是插入排序的**示例:

**示例:

//插入排序

void

insertsort

(int *a, int len)

//插入操作

a[i +1]

= key;

}}

演算法分析:

外迴圈執行n-1次,這很明顯。

但內迴圈執行的次數取決於輸入:

1.在最好的情況下,陣列已經排序並且(a [j]> x)總是為假所以不需要移位資料,並且內部迴圈執行在o(1),

2.在最壞的情況下,陣列被反向排序並且(a [j]> x)始終為真插入始終發生在陣列的前端,並且內部迴圈以o(n)執行。

因此,最佳情況時間是o(n × 1) = o(n) ,最壞情況時間是o(n × n) = o(n²).

希爾排序

希爾排序是插入排序的改進,又稱「縮小增量排序」用gap作為增量,增量的初值一般為length/2,每迴圈一次除2直至gap<=1時停止迴圈;

下面為希爾排序的**;

**為:

//希爾排序

void

shellpass

(int *a, int len)

/*show(a, len);*/}}

}}

希爾排序演算法分析;

希爾排序的關鍵並不是隨便分組後各自排序,而是將相隔某個「增量」的記錄組成乙個字序列,實現跳躍式的移動,使得排序的效率提高。這的「增量」選取就非常關鍵了。我們採用的是length/2的方式選取。不過科學研究表明,當增量序列為dlta[k] = 2^(t-k+1) - 1,0 <=k<=t<=log2(n+1)時,可以獲得不錯的效率,其時間複雜度為o(n^(3/2)), 要好於o(n^2)。

希爾排序是不穩定的排序,他是人們最早的把排序演算法從o(n²)改進到現在的o(n㏒n)的演算法,還是有很大的學習意義的;

經典排序演算法(2) 插入排序演算法 希爾排序詳解

直接插入排序是一種最簡單的插入排序。插入排序 每一趟將乙個待排序的記錄,按照其關鍵字的大小插入到有序佇列的合適位置裡,直到全部插入完成。這個過程類似摸牌 假設有一組無序序列 r0,r1,rn 1。所以我們需要將 ri 和 r0 ri 1 進行比較,確定要插入的合適位置。這就需要乙個內部迴圈,我們一般...

排序演算法詳解

直接插入 二分插入 希爾排序 氣泡排序 快排 簡單選擇 堆排序 歸併排序 基數排序 總結 一 穩定性 穩定 氣泡排序 插入排序 歸併排序和基數排序 不穩定 選擇排序 快速排序 希爾排序 堆排序 二 平均時間複雜度 o n 2 直接插入排序,簡單選擇排序,氣泡排序。在資料規模較小時 9w內 直接插入排...

排序演算法詳解

排序演算法可以分為內部排序和外部排序,內部排序是資料記錄在記憶體中進行排序,而外部排序是因為排序的資料很大,一次不能容納全部的排序記錄,在排序過程中需要訪問外存.常見的內部排序演算法有 氣泡排序 選擇排序 插入排序 希爾排序 歸併排序 快速排序 堆排序等.介紹氣泡排序是一種簡單的排序演算法,這個演算...