簡單排序算法——python

# 冒泡排序
def bubble_sort(alist):
    """冒泡排序"""
    for j in range(len(alist)-1, 0, -1):
        # j表示每次需要比較的次數,是逐漸減少的
        for i in range(j):
            if alist[i] > alist[i+1]:
                alist[i], alist[i+1] = alist[i+1],alist[i]

li1 = [3,5,1,6,7,2,4]
bubble_sort(li1)
print("bubble:", li1)

# 選擇排序
def selection_sort(alist):
    """選擇排序"""
    n = len(alist)
    # 總共需要循環n-1次
    for i in range(n-1):
        # 記錄最小位置
        min_index = i
        for j in range(i+1, n):
            if alist[j] < alist[min_index]:
                min_index = j
        # 如果選擇出的數據不在正確的位置(也就是原來i的位置)則進行交換
        if min_index != i:
            alist[i], alist[min_index] = alist[min_index], alist[i]

li2 = [3,5,1,6,7,2,4]
selection_sort(li2)
print("selection_sort:", li2)

# 插入排序
def insert_sort(alist):
    """插入排序"""
    # 從第二個位置,即下標爲1的元素開始向前插入
    for i in range(1, len(alist)):
        # 從第i個元素向前比較,如果小於前一個元素則交換
        for j in range(i,0,-1):
            if alist[j] < alist[j-1]:
                alist[j], alist[j-1] = alist[j-1], alist[j]

li3 = [3,5,1,6,7,2,4]
insert_sort(li3)
print("insert_sort:", li3)

# 快速排序
def quick_sort(alist, start, end):
    """快速排序"""
    # 遞歸退出的條件
    if start >= end:
        return
    # 設定起始元素爲基準元素
    min = alist[start]
    # low爲序列左邊的由左向右移動的遊標
    low = start
    # high爲序列右邊的由右向左移動的遊標
    high = end
    while low < high:
        # 如果low和high未重合,且high指向的元素大於min基準元素,則high向左移動
        while low < high and alist[high] >= min:
            high -= 1

        # 將high指向的元素放到low位置上
        alist[low] = alist[high]

        # 如果low和high未重合,且low指向的元素小於min基準元素,則low向右移動
        while low < high and alist[low] < min:
            low += 1

        # 將low指向的元素放到high位置上
        alist[high] = alist[low]

    # low與high重合,退出循環,此時low所指的位置就是基準元素正確位置
    # 將基準元素放到該位置上
    alist[low] = min

    # 對基準元素右邊的子序列進行快速排序
    quick_sort(alist, start, low-1)
    # 對基準元素左邊的子序列進行快速排序
    quick_sort(alist, low+1, end)

li4 = [3,5,1,6,7,2,4]
quick_sort(li4, 0, len(li4)-1)
print("quick_sort:", li4)

# 歸併排序
def merge_sort(alist):
    if len(alist) <= 1:
        return alist
    # 二分分解
    num = len(alist)//2
    left = merge_sort(alist[:num])
    right = merge_sort(alist[num:])
    # 合併
    return merge(left, right)

def merge(left, right):
    """合併操作,將兩個有序數組left[]和right[]合併成大的有序數組"""
    # left和right的下標指針
    l, r = 0, 0
    result = []
    while l < len(left) and r < len(right):
        if left[l] <= right[r]:
            result.append(left[l])
            l += 1
        else:
            result.append(right[r])
            r += 1

    result += left[l:]
    result += right[r:]
    return result

li5 = [3,5,1,6,7,2,4]
sorted_list = merge_sort(li5)
print("merge_sort:", sorted_list)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章