[排序N大件之]謝爾排序
阿新 • • 發佈:2020-09-23
這個我們跳過,好不好
答案是不行啊,學著看一個樂呵吧。
不過從這裡開始,讓我第一次接觸一個排序中的分治概念吧,後面歸併排序和快速排序都需要,謝爾排序本質上就是一個對子列表的一個插入排序
當每一個子列表逐漸有序時,最後維持整個列表的有序,付出的代價也會更小
謝爾排序需要一個gap,這個就是每個子列表中,每個元素的間隔,如果是採用二分的思想去構造子列表
第一個gap = len(nums) // 2時,就會有len(nums) //2 個列表,子列表中每個元素的間隔為len(nums) // 2,每個子列表中有1~2~3個元素
把gap在縮短一半,就會重新產生gap//2個列表,子列表中每個元素的間隔為gap//2, 每個子列表中多多少個元素呢?我猜是大概是4個或5個吧
當gap等於1時,那個就會產生一個子列表,那麼當前子列表就是整個列表了,元素間隔為1,每個子列表中有len(nums)個元素
謝爾排序還需要每個子列表的位置,用來作為每個子列表進行排序的初始位置
是不是有點暈了?我也有一點,畫個圖的話大概就是下面那個樣子
所以只要把子列表構造好,傳入每個列表的起始位置和gap值分別進行插入排序,謝爾排序就完成了
def shellSort(nums): gap = len(nums) // 2 while gap > 0: for i in range(gap): subInsertionSort(nums, i, gap) gap= gap // 2 return nums def subInsertionSort(nums, start_index, gap): for i in range(start_index + 1, len(nums), gap): cur = nums[i] position = i while position >= gap and nums[position - gap] > cur: nums[position] = nums[position - gap] position= position - gap nums[position] = cur if __name__ == "__main__": numbers = [3, 7, 5, 4, 8, 9, 6, 2, 1] print(shellSort(numbers))