天天看點

排序1:冒泡排序

思路:依次比較相鄰兩個元素,小的排在前面,大的排在後面,發現順序錯誤就交換兩者的前後順序。

range函數:

range(start,stop,[step]):生成一個可疊代對象
注意點:
setp可以省略,預設為1
左閉右開區間
舉例:
range(10) # 從 0 開始到 10
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
range(0, 30, 5) # 步長為 5
[0, 5, 10, 15, 20, 25]
range(0, 10, 3) # 步長為 3
[0, 3, 6, 9]
range(0, -10, -1) # 負數
[0, -1, -2, -3, -4, -5, -6, -7, -8, -9]
range(0)
[]
range(1, 0)
[]
           

複制

python3實作:

from typing import List
def bubble_sort(arr: List[int]):
    """
    arr:待排序清單,list中的元素類型為int
    """
    length = len(arr)
    #清單長度為1和0時直接傳回
    if length <= 1:
        return
    for i in range(length-1):
        is_made_swap = False
        #設定标志位,如果已經有序,則直接跳出
        for j in range(length-1):
            if arr[j] > arr[j+1]:
                arr[j],arr[j+1] = arr[j+1],arr[j]
                is_made_swap = True
        if not is_made_swap:
            break


if __name__ == '__main__':
     import random
     random.seed(54)
     arr = [random.randint(0,100) for _ in range(10)]
     print("原始資料", arr)
     bubble_sort(arr)
     print("排序後:",arr)


結果:
原始資料 [17, 56, 71, 38, 61, 62, 48, 28, 57, 42]
排序後: [17, 28, 38, 42, 48, 56, 57, 61, 62, 71]           

複制

上面會改變輸入的數組,不改變原始數組思路如下:

建立一個list,再對新的list進行排序

from typing import List

def bubble_sort(arr:List[int]):
    length = len(arr)
    res = arr[:]
    if length <= 1:
        return res
    is_swap = False
    for i in range(length-1):
        for j in range(length-1):
            if res[j]>res[j+1]:
                res[j],res[j+1] = res[j+1],res[j]
            is_swap = True
        if not is_swap:
            break
    return res


if __name__ == '__main__':
    input_arr = [1,8,2]
    sorted_arr = bubble_sort(input_arr)
    print(sorted_arr)

結果:
[1, 2, 8]           

複制