LeetcodeDaily_Day1 冒泡排序bubble_sort(Python實現)

  • 基本冒泡排序
def bubble_sort(nums): 
    n, compareCount = len(nums), 0
    for i in range(n):
        for j in range(1, n-i): # 設置邊界
            compareCount += 1
            if nums[j] < nums[j-1]: # 比較&交換
                nums[j-1], nums[j] = nums[j], nums[j-1]        
    print("總交換次數", compareCount)
    return nums
  • 改進1-設置交換操作標誌
def bubble_sort_2(nums):
    n, compareCount = len(nums), 0
    for i in range(n):
        swapFlag = False # 設置交換標誌
        for j in range(1, n-i):
            compareCount += 1
            if nums[j] < nums[j-1]:
                swapFlag = True # 標誌切換
                nums[j], nums[j-1] = nums[j-1], nums[j]
        if not swapFlag: # 無交換跳出循環
            break
    print("總交換次數", compareCount)
    return nums
  • 改進2-每次交換記錄最後一次交換的位置,作爲下一次循環的邊界
def bubble_sort_3(nums):
    n, compareCount = len(nums), 0
    lastSwapIndex, sortBoundary = 0, n
    for i in range(n):
        swapFlag = False
        for j in range(1, sortBoundary):
            compareCount += 1
            if nums[j] < nums[j-1]:
                nums[j-1], nums[j] = nums[j], nums[j-1]
                swapFlag = True
                lastSwapIndex = j
        sortBoundary = lastSwapIndex
        if not swapFlag:
            break           
    print("總交換次數", compareCount)
    return nums
  • 雙向冒泡-雞尾酒排序
def cockTailSort(nums):
    n, compareCount = len(nums), 0
    for i in range(n//2):
        swapFlag = False
        for j in range(i+1, n-i): #最大值冒泡
            compareCount += 1
            if nums[j] < nums[j-1]:
                nums[j], nums[j-1] = nums[j-1], nums[j]
                swapFlag = True

        for j in range(n-i-1,i, -1): # 最小值冒泡,邊界調整
            compareCount += 1
            if nums[j] < nums[j-1]:
                nums[j], nums[j-1] = nums[j-1], nums[j]
                swapFlag = True
        if not swapFlag:
            break
    print("總交換次數", compareCount)
    return nums
  • 改進雙向冒泡-改進雞尾酒排序
def cockTailSort_2(nums):
    n, compareCount = len(nums), 0
    leftBoundary, rightBoundary = 0, n
    while leftBoundary < rightBoundary:
        lastSwapIndex = leftBoundary
        swapFlag = False
        for j in range(leftBoundary+1, rightBoundary): #最大值冒泡,更新右邊界
            compareCount += 1
            if nums[j] < nums[j-1]:
                nums[j], nums[j-1] = nums[j-1], nums[j]
                swapFlag = True
                lastSwapIndex = j
        rightBoundary = lastSwapIndex

        for j in range(rightBoundary-1, leftBoundary, -1): # 最小值冒泡,更新左邊界
            compareCount += 1
            if nums[j] < nums[j-1]:
                nums[j], nums[j-1] = nums[j-1], nums[j]
                swapFlag = True
                lastSwapIndex = j
        leftBoundary = lastSwapIndex
        if not swapFlag:
            break
    print("總交換次數", compareCount)
    return nums
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章