1. 程式人生 > >Python排序演算法(二) 快速排序、希爾排序、歸併排序

Python排序演算法(二) 快速排序、希爾排序、歸併排序

這篇文章有的排序演算法是:快速排序、希爾排序、歸併排序。

快速排序

'''
快速排序
'''

def quick_sort(aList, first, last):

    if first >= last:
        return

    min_val = aList[first]
    low_index = first
    hight_index = last

    while low_index < hight_index:
        # hight 左移動
        while low_index < hight_index and min_val <= aList[hight_index]:
            hight_index -= 1
        aList[low_index] = aList[hight_index]

        # low 右移動
        while low_index < hight_index and min_val > aList[low_index]:
            low_index += 1
        aList[hight_index] = aList[low_index]

    aList[low_index] = min_val

    # 左邊
    quick_sort(aList, first, low_index - 1)
    # 右邊
    quick_sort(aList, low_index + 1, last)


if __name__ == "__main__":

    li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    # li = [26, 93, 54]
    print(li)
    quick_sort(li, 0, len(li) - 1)
    print(li)

快速排序的思路是:

1、從列表中找出一個元素,min_val 作為“基準”元素。

2、然後對列表進行排序,排序的規則是,比min_val基準元素小的放在基準元素的左邊,比min_val 基準元素大的放在基準元素的右面。這個時候基準元素就在這個列表的中間的位置。這個稱為分割槽操作。

3、遞迴進行操作,就是在把基準元素左邊的元素當做一個列表重複第2步操作,把基準元素左邊的元素當做一個列表重複第2步操作。

歸併排序

'''
歸併排序
'''

def merge_sort(aList):

    n = len(aList)

    if n <= 1:
        return aList
    mid = n//2

    left_li = merge_sort(aList[:mid])
    right_li = merge_sort(aList[mid:])

    left_pointer, right_pointer = 0, 0
    result = []

    while left_pointer < len(left_li) and right_pointer < len(right_li):

        if left_li[left_pointer] <= right_li[right_pointer]:
            result.append(left_li[left_pointer])
            left_pointer += 1
        else:
            result.append(right_li[right_pointer])
            right_pointer += 1

    result += left_li[left_pointer:]
    result += right_li[right_pointer:]

    return result

if __name__ == "__main__":

    li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    print(li)
    a = merge_sort(li)
    print(a)

歸併排序的思路是:

1、歸併排序的思想就是先遞迴分解陣列,再合併陣列。

2、然後將兩個列表第一個元素進行比較,將小的資料push到新的列表裡面。

希爾排序

'''
希爾排序
'''

def shell_sort(aList):
    n = len(aList)
    gap = n // 2

    while gap > 0:

        for j in range(gap, n):

            i = j
            while i > 0:
                if aList[i] < aList[i - gap]:
                    aList[i - gap], aList[i] = aList[i], aList[i - gap]
                    i -= gap
                else:
                    break
        gap //= 2

if __name__ == "__main__":

    li = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    print(li)
    shell_sort(li)
    print(li)