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