【S-排序】python实现八大排序算法之1-冒泡排序改进

python实现八大排序算法

冒泡排序

冒泡排序算法步骤如下:

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
'''
Creat by HuangDandan
2018-08-13
[email protected]
i冒泡的次数
j每次冒泡的两两元素比较的次数
'''
def BubbleSortBasic(Lst):
    for i in range(0, len(Lst)):
        for j in range(0,len(Lst)-i-1):
            if Lst[j] > Lst[j+1]:
                Lst[j], Lst[j+1] = Lst[j+1], Lst[j]
              
Lst2 = [1, 3, 2, 1, 5]
BubbleSortBasic(Lst2)
print(Lst2)

冒泡排序改进算法1

  • 对于全员无序或者没有重复元素的序列,上述算法在同一思路上是没有改进余地的,但是如果一个序列中存在重复元素或者部分元素是有序的呢,这种情况下必然会存在不必要的重复排序,如果进行某一趟排序时并没有进行数据交换,则说明数据已经按要求排列好,可立即结束排序,避免不必要的比较过程。
  • 改进算法实现:找一个标志位flag.如果我们继续按照BubbleSortBasic的方法,那还是要跑n-1趟,是不是有点浪费时间,没跑完一趟就判断一次原数组现在是否有序,如果有序;直接return 掉;于是这里就有了一个标志位flag去帮助我们判断!
'''
Creat by HuangDandan
2018-08-13
[email protected]

#i冒泡的次数
#j每次冒泡的两两元素比较的次数
#冒泡排序改进1:如果数组是有序,立即退出,减少冒泡的次数
'''

def BubbleSortImprove(Lst):
    times = 0
    for i in range(0, len(Lst)-1):
        flag = 1 #假定每次进入的都是有序的 flag为1
        times += 1
        for j in range(0,len(Lst)-i-1):
            if Lst[j] > Lst[j+1]:
                Lst[j], Lst[j+1] = Lst[j+1], Lst[j]
                flag = 0 #如果发生交换,flag置为0
        print('Lst{}: {}'.format(times, Lst))
        if flag == 1: #如果这趟走完,没有发生交换,则f原数组有序,退出
            break

冒泡排序改进算法2

  • 第二部优化 BubbleSort3: 减少内部循环比较的次数,也就是j的循环次数,记下上次一堆元素比较的的下标,j循环的次数可以减少。在改进1的基础上增加一个记下标的标量n,将每一对相邻的元素比较循环的次数从len(Lst)-i-1变成n
'''
Creat by HuangDandan
2018-08-13
[email protected]

冒泡排序改进1:如果数组是有序,立即退出减少冒泡的次数
冒泡排序改进2:减少内部循环比较的次数,也就是j的循环次数,记下上次一堆元素比较的的下标,j循环的次数可以减少。
'''

def BubbleSortImprove2(Lst):

    times = 0
    for i in range(0, len(Lst)-1):
        flag = 1 #假定每次进入的都是有序的 flag为1
        times += 1
        k = len(Lst)-i-1
            for j in range(0,k):
                if Lst[j] > Lst[j+1]:
                    Lst[j], Lst[j+1] = Lst[j+1], Lst[j]
                    flag = 0 #如果发生交换,flag置为0
                    k = j

       print('Lst{}: {}'.format(times, Lst))
        if flag == 1: #如果这趟走完,没有发生交换,则f原数组有序,退出
            break

参考书籍:裘宗燕 数据结构与算法:Python的语言描述
参考博客:
https://www.jb51.net/article/123664.htm?utm_medium=referral
https://blog.csdn.net/bitboss/article/details/51559034
https://www.cnblogs.com/chengxiao/p/6104371.html

你可能感兴趣的:(【S-排序】python实现八大排序算法之1-冒泡排序改进)