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時,剛好排完
以下是具體實現:
defshell_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 的子串行...