利用python实现冒泡排序法(用python编写冒泡排序)

冒泡排序法:

  1. 属于交换排序
  2. 两两比较大小,交换位置。如同水泡咕嘟咕嘟往上冒
  3. 结果分为升序和降序排列

升序排序原理

  1. n个数从左至右,索引编号从0开始到n-1,索引0和1的值比较,如果索引0大,则交换两者位置,如果索引1大,则不交换。继续比较索引1和2的值,将大值放在右侧,直到索引n-2和n-1比较完,第一轮比较完成,此时,位于最右侧的值为最大的数。
  2. 第二轮从索引0开始比较到索引n-2,因为最右侧n-1位置上已经是最大值了。依次类推,每一轮都会减少最右侧的不参与比较,直至剩下的最后2个数比较。(降序和升序相反)

冒泡排序算法代码:

#冒泡排序法
import time
data=[1,2,7,4,5,6]
count=0 #记录比较次数
count_swap=0 #记录交换次数
print("待排序的列表:",data)
start_time=time.time()
for i in range(len(data)):
    for j in range(len(data)-i-1):
        count+=1
        if data[j]>data[j+1]:
            tmp=data[j]
            data[j]=data[j+1]
            data[j+1]=tmp
            count_swap+=1
        print("第{0}轮:索引{1}和索引{2}比较后的结果:{3}".format(i+1,j,j+1,data))        
span_time=(time.time()-start_time)*1000
print("排序结果为:{0},总比较次数为:{1},交换次数为:{2},耗时:{3} 毫秒".format(data,count,count_swap,span_time))

运行结果如下:


由运行结果可以看出,经过第1轮的循环比较后,列表已经达到了从小到大的排序结果,第2轮循环过程中,没有出现元素位置交换,第3/4/5轮的循环比较并没有比较的必要。由此可以对算法进行优化,当某轮循环后没有元素进行位置交换,则说明达到了排序结果,跳出循环,程序终止

算法优化代码:

#冒泡排序法优化算法
import time
data=[1,2,7,4,5,6]
count=0 #记录比较次数
count_swap=0 #记录交换次数
print("待排序的列表:",data)
start_time=time.time()
for i in range(len(data)):
    flag=False #定义一个标记,初始值为False,当某轮循环中存在元素位置交换,则为True
    for j in range(len(data)-i-1):
        count+=1
        if data[j]>data[j+1]:
            tmp=data[j]
            data[j]=data[j+1]
            data[j+1]=tmp
            count_swap+=1
            flag=True
        print("第{0}轮:索引{1}和索引{2}比较后的结果:{3}".format(i+1,j,j+1,data))

    if not flag:
        break
span_time=(time.time()-start_time)*1000
print("排序结果为:{0},总比较次数为:{1},交换次数为:{2},耗时:{3}毫秒".format(data,count,count_swap,span_time)

运行结果如下:


由上述运行结果可以看出,程序进行了2轮循环比较后可以确认达到了最终排序结果,没有进行后面3轮的比较,由此也节省了算法运行时间,提升算法效率。

算法总结:

  1. 冒泡法需要数据一轮轮进行比较
  2. 可以设定一个标记判断此轮是否有数据交换发生,如果没有发生交换,可以结束排序,如果发生交换,继续下一轮排序
  3. 最差的排序情况是:初始顺序与目标顺序完全相反,遍历次数为1,2....n-1之和n(n-1)/2
  4. 最好的排序情况是:初始顺序与目标顺序完全相同,遍历次数为n-1
  5. 时间复杂度O(n**2)

相关文章

C语言排序方法——冒泡排序详解!你学会了吗?

冒泡排序法的基本思路为:每次将相邻的两个数比较,将小的调在前面。举个例子,如果有6个数:9,8,5,4,2,0。第一次先将最前面的两个数9和8对调。第二次将第2个数和第3个数对调(9和5)······...

冒泡排序(冒泡排序python)

冒泡排序(Bubble Sort)是一种简单的排序算法,其基本思想是对待排序的元素从前向后依次比较相邻的两个元素,如果顺序不对则交换它们的位置,轮比较下来,最大的元素就会“冒泡”到数组的末尾重复这个过...

冒泡排序——C语言(冒泡排序c语言什么意思)

冒泡排序的图示:假设有一个数组 [5, 3, 8, 6, 2],逐步冒泡排序的过程:第一轮:比较 5 和 3,5 > 3,交换 → [3, 5, 8, 6, 2]比较 5 和 8,5 <...

基于C语言的冒泡排序法(c语言冒泡排序思路)

冒泡排序法:对数组中的n个整数类型的数据元素(a[0]~a[n-1])进行排序。void BubbleSort(int a[],int n){ int i,j,flag=1; int temp; fo...

一文透彻解析冒泡排序(冒泡排序有几种方法)

谈一谈冒泡排序看到很多人谈算法题,上来就是一段代码,你去看去吧,自己悟去吧。心塞有的题目老长时间就是不理解。。。本文分析一下啥是冒泡排序?排序就是一组数字,按照顺序排列(从小到大) ,冒泡排序是排序的...

常见的三种排序(冒泡排序、插入排序、选择排序)

冒泡排序什么是冒泡排序?百度百科解释:它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序(如从大到小、首字母从从Z到A)错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要...