1. 程式人生 > 實用技巧 >[排序N大件之]謝爾排序

[排序N大件之]謝爾排序

這個我們跳過,好不好

答案是不行啊,學著看一個樂呵吧。

不過從這裡開始,讓我第一次接觸一個排序中的分治概念吧,後面歸併排序和快速排序都需要,謝爾排序本質上就是一個對子列表的一個插入排序

當每一個子列表逐漸有序時,最後維持整個列表的有序,付出的代價也會更小

謝爾排序需要一個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))