zoukankan      html  css  js  c++  java
  • 排序算法(1):冒泡排序和插入排序

    1.1 冒泡排序

    冒泡排序需要多次遍历列表。它比较相邻的项并交换那些无序的项。每次遍历列表将下一个最大的值放在其正确的位置。实质上,每个项“冒泡”到它所属的位置。
    用python写交换操作时,与大多数编程语言略有不同(需要临时储存位置),python可以执行同时赋值,语句 a,b = b,a 两个赋值语句同时完成。
    下图展现了冒泡排序的第一次遍历:

    用python实现冒泡排序的代码如下:
    这里写图片描述

    def bubbleSort(alist):
        for passnum in range(len(alist)-1,0,-1):
            for i in range(passnum):
                if alist[i]>alist[i+1]:
                    alist[i], alist[i+1] = alist[i+1], alist[i]
    
    alist = [54,26,93,17,77,31,44,55,20]
    bubbleSort(alist)
    print(alist)

    1.2 短冒泡排序

    冒泡排序通常被认为是最低效的排序方法,因为它必须在最终位置被知道之前交换项。 这些“浪费”的交换操作是非常昂贵的。 然而,因为冒泡排序遍历列表的整个未排序部分,它有能力做大多数排序算法不能做的事情。特别地,如果在遍历期间没有交换,则我们知道该列表已排序。 如果发现列表已排序,可以修改冒泡排序提前停止。这意味着对于只需要遍历几次列表,冒泡排序具有识别排序列表和停止的优点。

    在原来的冒泡排序基础上设置exchange,初始值设置为True。只要某趟冒泡排序有交换,则exchange在循环中为True,否则为False,停止冒泡。
    短冒泡排序代码如下:

    def shortBubbleSort(alist):
        exchanges = True
        passnum = len(alist)-1
        while passnum > 0 and exchanges:
           exchanges = False
           for i in range(passnum):
               if alist[i]>alist[i+1]:
                   exchanges = True
                   alist[i], alist[i+1] = alist[i+1], alist[i]
           passnum = passnum-1
    
    alist=[20,30,40,90,50,60,70,80,100,110]
    shortBubbleSort(alist)
    print(alist)

    2 插入排序

    始终在列表的较低位置维护一个排序的子列表。然后将每个新项 “插入” 回先前的子列表,使得排序的子列表称为较大的一个项。其过程如下图所示:
    这里写图片描述
    我们开始假设有一个项(位置 0 )的列表已经被排序。在每次遍历时,对于每个项 1至 n-1,将针对已经排序的子列表中的项检查当前项。当我们回顾已经排序的子列表时,我们将那些更大的项移动到右边。 当我们到达较小的项或子列表的末尾时,可以插入当前项。如下图所示:
    这里写图片描述
    python实现代码如下:

    def insertionSort(alist):
       for index in range(1,len(alist)):
    
         currentvalue = alist[index]
         position = index
    
         while position>0 and alist[position-1]>currentvalue:
             alist[position]=alist[position-1]
             position = position-1
    
         alist[position]=currentvalue
    
    alist = [54,26,93,17,77,31,44,55,20]
    insertionSort(alist)
    print(alist)

    关于移位和交换的一个注意事项也很重要。通常,移位操作只需要交换大约三分之一的处理工作,因为仅执行一次分配。在基准研究中,插入排序有非常好的性能。

    参考资料:《problem-solving-with-algorithms-and-data-structure-using-python》
    http://www.pythonworks.org/pythonds

  • 相关阅读:
    Javascript 生成全局唯一标识符 (GUID,UUID)
    nginx 与location语法详解
    nginx的安装与使用
    Linux上python3的安装和使用
    Linux上Redis安装和简单操作
    MySQL + centos +主从复制
    web服务基础
    linux系统基础优化及高级操作命令
    vim编辑
    Linux的基本命令
  • 原文地址:https://www.cnblogs.com/mtcnn/p/9411617.html
Copyright © 2011-2022 走看看