插入排序與希爾排序

2021-10-06 18:35:16 字數 2072 閱讀 4493

插入排序是一種非常古老的排序思想,他的過程可以被形象的模擬出來:假設乙個人要摸起一副被打亂的撲克牌,我們注意到,剛開始時這個人手上並沒有牌,並且他每次只從牌堆中摸出一張牌,每當摸上一張牌時,他選擇從右向左(即從大到小)將這張牌與手中原有的牌進行比較,並最終將其插入到自己手牌中適合的位置,當牌堆中的牌全部被摸出時,他便完成了一次簡單的插入排序。

這裡面顯然有一些規律:

第一,這個人手中的牌始終是有序的,因為他始終將摸上來的牌按順序插入手牌中;

第二,在整個插入排序的過程中,我們每次只拿出乙個元素來對他進行比較操作,因此,插入排序的空間效率是o(1)。

第三,每次將牌插入手牌時,牌與手牌的比較次數,實際上取決於原本牌堆中不同大小的牌的擺放順序。因此,該演算法的效率並不穩定,當牌堆中牌按照從小到大分布,這意味著每一次我們摸起一張牌,都可以直接將他插入手牌的最右邊,這樣我們擁有了o(n)級別的時間效率。而當牌堆中牌按照從大到小分布,意味著每一次的插入,我們都需要將該牌與手牌中所有的牌比較一遍,並將它置於手牌的最左邊,這顯然需要浪費大量的時間,時間效率實際上降低到了o(n

2n^2

n2)。因此,我們需要對簡單的插入排序進行改進。

(插入排序c++**實現)

template

<

class

t>

void

insert_sort

(t array,

int n)

array[j +1]

= current_insert;

}}

希爾排序實際上是對插入排序的優化處理。

演算法思想:

現將待排序序列轉換成若干個小序列,對於這些小序列內部進行插入處理。

在確定當前小序列都排序完畢後,逐漸增加小序列的規模,並減少小序列的個數,使得該待排序列整體逐漸處於更有序的狀態

這時我們發現,該待排序序列逐漸接近撲克牌問題中的最優情況,這時候對排隊進行一次整體的插入排序,能達到接近o(n)的演算法效率。

以上就是希爾排序的全部演算法思想,這裡面最重要的部分很顯然就在於「逐漸增加小序列的規模,並減少小序列的個數」。我們需要找到乙個合適的方法來控制小序列的規模,從而能盡可能的增加排序的效率。

我們用gap來表示增量,首先選擇乙個增量gap=n/2,當我們完成了該規模下小序列的排序時,再按照gap=gap/2的規則來改變增量,這時我們實際上得到了乙個關於增量的序列。注意這裡最後一步的增量一定為1,這意味著按照當前增量序列進行希爾排序,我們不需要再額外進行一次整體的插入排序。

如上圖所示,遵循希爾排序的第乙個增量n/2,我們從亂序陣列的第乙個元素開始,將每個元素跳躍著與他後面第n/2個元素進行插入排序,我們實際上將原陣列分為了,,,,這五組資料,並對每一組資料分別進行插入排序。

第二步,遵循希爾排序的第二個增量n/2/2,我們將待排序陣列分為,兩組,並分別對兩組資料進行插入排序。

最後一步我們對整個資料整體進行希爾排序,可以看到進行到最後一步時,該陣列已經非常接近於乙個正序陣列,這將始我們最後一次插入排序的效率非常接近於o(n)

針對gap=gap/2的增量序列的**實現

template

<

class

t>

void

shell_sort

(t array,

int n)

}

當然,這種增量序列仍然存在很多可以改進的地方,由於我們只是單純的對於增量進行了不斷除2的操作,這導致我們選取的增量並不互質,這導致在我們比較的過程中,可能會產生某些位置之間被重複多次比較的可能性,降低了演算法的處理效率,hibbard等各種增量序列是乙個可行的解決方法。

插入排序與希爾排序

插入排序描述 有乙個陣列num n 它有n個元素,假設其中n 1已經排好序了,那麼把剩餘的那個元素插入到合適的位置即可,這樣就完成了排序。根據這個思想,很明顯的可以使用遞迴來完成它。下面是遞迴版本的 include using namespace std void insertionsort int...

插入排序 希爾插入排序

本文借鑑於lsgo實驗室創始人馬老師 演算法 希爾插入排序 delta len nums 2 while delta 0 shell delta,nums delta delta 2return nums defshell delta,key for i in range delta,len key...

插入排序 希爾排序

我們知道當乙個序列基本有序時,直接插入會變得很高效。因為此時只需少量的移動元素,操作集中在元素的比較上。基於這種想法,我們就試圖把乙個序列在進行直接插入前調整得盡量有序。這就是希爾排序 shell sort 的核心思路。shell只是演算法發明者的名字,無特殊含義 那到底該怎麼做呢?希爾排序一反以前...