zoukankan      html  css  js  c++  java
  • 自学python笔记 冒泡法排序2

    冒泡法排序延伸:

    # !user/bin/python3
    # -*- coding:utf-8 -*-
    # Author:Guo Zhengbing  18-9-3
    
    import random
    
    '''
    冒泡排序算法及其优化
    冒泡排序的基本特征是只能交换相邻的元素。
    从下边界开始,一趟扫描下来,可以把当前最大值顶到上边界;
    如果没有发生交换操作,则表示数组是有序的。
    '''
    # 算法一:基本冒泡排序
    def BubbleSort_1(arr):
        # 外层循环累计排序轮数,同时控制待排序数组的上边界,即A[0..i]为待排序部分
        # 内层循环扫描A[0..i-1],比较相邻元素,并通过交换元素值的方式将最大值顶到最上方
        for i in range(len(arr) - 1, 0, -1):
            for j in range(0, i):
                if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j]
    
    '''
                # 算法二:冒泡排序改进,设置交换操作标志
                def BubbleSort_2(arr):
                    for i in range(len(arr) - 1, 0, -1):
                        swapFlag = False  # 先假设未做交换操作
                        for j in range(0, i):
                            if arr[j] > arr[j + 1]:
                                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                                swapFlag = True  # 设置交互操作标志
                        if not swapFlag: break  # 无交换操作,表示已完成排序,退出循环
    '''
    
    """
    
    # 算法二:双向冒泡(鸡尾酒排序),因为未发生交换操作的区域是有序的,故每轮扫描下来可以更新上下边界,减少扫描范围
    def BubbleSort_3(arr):
        low, high = 0, len(arr) - 1
        while low < high:
            swapPos = low  # 先假设最后一次发生交换操作的位置为low
            for j in range(low, high):  # 顺序扫描A[low..high-1]
                if arr[j] > arr[j + 1]:
                    arr[j], arr[j + 1] = arr[j + 1], arr[j]
                    swapPos = j
            high = swapPos  # 修改待排序数组的上界为最后一次发生交换操作的位置
            for j in range(high, low, -1):  # 逆序扫描A[low+1..high]
                if arr[j] < arr[j - 1]:
                    arr[j], arr[j - 1] = arr[j - 1], arr[j]
                    swapPos = j
            low = swapPos  # 修改待排序数组的下界为最后一次发生交换操作的位置
    
    a = list(range(1, 10))
    random.shuffle(a)
    print(a)
    BubbleSort_1(a)
    print(a)
    
    """

    某位老哥的方法,引用学习

  • 相关阅读:
    oracle教程:PLSQL常用方法汇总
    CORBA_TAO的环境配置
    安装使用Sybase ASE 12.5
    Oracle数据库备份命令Exp/Imp
    30个非常流行的提示信息插件(jQuery Tooltip Plugin)
    Spring.NET学习笔记——目录(转)
    JavaScript trim函数大赏 (转)
    使用基于 Informix Dynamic Server 的 Server Studio JE
    接触 CORBA 内幕: IOR、GIOP 和 IIOP
    Oracle数据库SQL
  • 原文地址:https://www.cnblogs.com/cn-gzb/p/9583321.html
Copyright © 2011-2022 走看看