插入排序 shell排序

2022-08-20 02:30:16 字數 1316 閱讀 8700

shell排序

這個系列是回顧之前所學,是用python商量著完成的。

路過的大佬就當看個樂,實現演算法的方式不一,也有討巧的做法。

我只講講我的思路,希望大家瀏覽的時候能多多提建議,共同學習共同進步。

shell排序基本思想:

shell是插入排序的一種高效改進版本,shell排序是不穩定排序演算法,該演算法由shell在2023年提出而命名,屬於比較早的演算法之一。

shell排序是把記錄按下標的一定增量分組,將其稱之為gap,對每組使用直接插入排序演算法

每一次分組排序完成,gap都會除以2並向下取整,對更細分的分組進行直接插入排序

直至gap為1,整個檔案恰被分成一組,演算法便終止。

但就我所理解的,當每次分組完成,比較的永遠是每個分組對應下標的值

比如: [2, 4,  5, 1,   3]

其中2、5、3的下標都為0,gap為2,比較的時候就比較它們三個的值,根據降序交換位置

隨著gap的減小,整個序列的排序愈發明顯

為1時,剛好排完

以下是具體實現:

def

shell_sort(list):

gap = len(list) // 2

#1.首先確定一下,第一次gap的值

#6.gap是要大於等於1的,一般到1就基本ok了

while gap >= 1:

for i in

range(gap, len(list)):

#2.這裡為什麼要設定成len(list),這是防止出現序列是奇數的情況,如果這裡是gap的倍數那麼會落下最後乙個值取不到的情況

#3.這裡為啥要從gap開始取值,因為我們是要比較不同組同下標的值嘛

#5.所以這裡是不是還要有乙個迴圈呀? i不能等於0,避免out of range

while i >0:

if list[i] < list[i-gap]:

#4.比較大小,這裡沒什麼好講的

list[i], list[i-gap] = list[i-gap], list[i]

else

:

break

#5.這裡會存在乙個問題,就是如何確保比較的值一定比前面的值大還是小?

#5.所以我們還是需要拿當前的值去比較前面的值大小,這裡就需要迭代一下

i -=gap

#6.那每一次的分組排序完成,我們就需要改變gap值的大小

gap //= 2

return list

以上,接下來實現一下直接插入排序

插入排序 直接插入排序和shell排序

1.排序的分類 2.直接插入排序 1 演算法思想 直接插入排序是一種簡單的排序演算法,將第乙個元素看作有序子串行,從第二個元素開始,和前乙個元素比較,若小於,將前乙個元素向後移,將第二個元素插入到有序子串行中 若大於,直接將第二個元素插入到有序子串行中。按這種過程繼續下去,直到完成所有的有序子串行。...

插入排序和希爾 Shell 排序

插入排序 陣列前k 1個元素已經有序,如何確定第k個元素的插入位置,使得這k個元素有序。方法1 從左到右掃瞄掃瞄這個有序子陣列,直到遇到第乙個大於等於a k 的元素,然後把a k 插在這個元素的前面。方法2 從右到左掃瞄這個有序子陣列,直到遇到第乙個小於等於a k 的元素,然後把a k 插在這個元素...

插入排序之希爾(shell)排序

希爾排序是1959 年由d.l.shell 提出來的,相對直接排序有較大的改進。希爾排序又叫縮小增量排序。基本思想 選擇乙個 增量序列 t1,t2,ti tj,tk,其中ti tj,tk 1 按增量序列個數k,對序列進行k 趟排序 每趟排序,根據對應的增量ti,將待排序列分割成若干長度為m 的子串行...