資料結構 插入排序 希爾排序

2021-08-11 18:22:15 字數 1879 閱讀 4952

一、插入排序

<1>介紹:插入排序(insertion sort)的演算法描述是一種簡單直觀的排序演算法。它的工作原理是通過構建有序序列,對於未排序資料,在已排序序列中從後向前掃瞄,找到相應位置並插入。插入排序在實現上,通常採用in-place排序(即只需用到o(1)的額外空間的排序),因而在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素提供插入空間。

<2>思路:

從第乙個元素依次進行以下操作:對於當前元素可以認為當前元素之前的部分已經有序;取出當前位置的下乙個元素作為要排序的值,在已經排序的元素序列中從後向前掃瞄,如果該元素(已排序)大於新元素,將該元素移到下一位置;直到找到已排序的元素小於或者等於新元素的位置,將新元素插入到該位置中;

分別把下標從0到陣列元素個數-1的元素作為end,進行以上操作;每次迴圈的目的就是為了將當前tmp值放置在之前序列中該放的位置上,使得當前部分序列有序。

<3>優缺點:

假如現在需要將12345進行公升序插入排序,按照插入排序的特性時間複雜度為o(n),所以插入排序針對於接近有序的序列時間複雜度較低;但是若將12345進行降序排,那麼時間複雜度就會變為o(n^2);所以有了接下來的希爾排序。總之:對於接近有序的序列進行插入排序效率較優,對於無序的平均時間複雜度就會提公升到o(n^2)。

<4>實現:

void insertsort(int* arr, int sz)

else

break;

}arr[end + 1] = tmp;}}

<4>圖示過程:

二、希爾排序

<1>介紹:希爾排序,也稱遞減增量排序演算法,是插入排序的一種高速而穩定的改進版本,先將序列進行預排序再不斷縮小間隔,當間隔為1時即為插入排序。

希爾排序是基於插入排序的以下兩點性質而提出改進方法的:

1、插入排序在對幾乎已經排好序的資料操作時, 效率高, 即可以達到線性排序的效率;

2、但插入排序一般來說是低效的, 因為插入排序每次只能將資料移動一位。

<2>思路及排序效果:

①:先將整個待排元素序列分割成若干個子串行(由相隔某個「增量」的元素組成的)分別進行直接插入排序;

②:然後依次縮減增量再進行排序,待整個序列中的元素基本有序(增量足夠小)時,再對全體元素進行一次直接插入排序。

大致思路和插入排序相同,區別在於希爾排序可以給定乙個gap值,也就是間隔,可以預先先將間隔gap的序列對應有序,再不斷縮小gap值,到最後一趟依次比較。

<3>實現:

void shellsort(int* arr, int sz)

else

break;

}arr[end + gap] = tmp;}}

<4>圖示過程:

資料結構 插入排序 希爾排序

先用簡單的一句話概括,每次用陣列中乙個數字,與他之前的所有資料進行比較,如果滿足條件則更換順序。光這麼說,感覺還是有些晦澀難懂,那我們來舉個例子看看吧,畢竟要學以致用呀,奧利給。1 假設我們現在有乙個陣列 2 那麼我們需要先拿出最前面的兩位 1 進行比較,並且是用最有一位向前進行比較,3 5,那麼交...

資料結構之希爾排序(插入排序)

希爾排序 shell s sort 又稱 縮小增量排序 diminishing increment sort 是插入排序的一種,因d.l.shell於1959年提出而得名。希爾排序的誕生是由於插入排序在處理大規模陣列的時候會遇到需要移動太多元素的問題。希爾排序的思想是將乙個大的陣列 分而治之 劃分為...

資料結構09 插入排序 希爾排序

1 利用位移法,每次選擇乙個還未排序的資料和已經排過序的所有資料進行比較 2 如果已排序的數比需要排序的數大,則向後移動,讓位 不是交換 3 直到找到已排序的數比需要排序的數小時,證明已經找到了需要排序數應該插入的位置 4 將需要排序的數插入進合適的位置 1 在插入排序的基礎上改進的 2 每次得到乙...