基本排序算法系列——冒泡排序算法

排序算法是编程人员必须熟练掌握的算法之一,接下来会写几篇博客介绍基本的排序算法。首先先介绍冒泡排序算法!
————————————————————————————
**冒泡排序:**简单的说就是从待排序列的最底端开始,依次比较相邻两个数的大小,若上端的数小于下端的数,交换两个数的位置,若上端的数大于下端的数,则不交换两个数的位置,依次进行下去,这样就实现序列中最大的数“浮”到了最上端,故而形象的说它是冒泡排序。
————————————————————————————
俗话说,说的再好不如一图在手,见下图(来源自十大经典排序算法,一个介绍排序算法特别好的网站~)
在这里插入图片描述
接下来我们用程序来实现它(基于python)

#冒泡排序算法
#输入数据
x=input("请输入一个待排序列,相邻数字用空格分隔开:\n")
#数据的简单处理
x=x.split()#删掉空格,返回列表
x=[int(val) for val in x]#将列表中元素类型变成int型
#排序算法主题
for j in range(len(x)-1):
    for i in range(len(x)-j-1):
        if x[i]>x[i+1]:
            #交换两个数的顺序
            y=x[i]
            x[i]=x[i+1]
            x[i+1]=y
#数据的输出   
print(x)

看一下结果
在这里插入图片描述
上面代码的实现思路是利用了两个循环实现的,我们先看内循环

   for i in range(len(x)-j-1):
       if x[i]>x[i+1]:
           #交换两个数的顺序
           y=x[i]
           x[i]=x[i+1]
           x[i+1]=y

这个循环的功能就是将待排序列中最大的数“冒泡”到序列的右端(也就是最上端,利用交换实现,即冒泡排序的原理),比如j=0时,内循环运行之后的结果就是

#待排序列
9 8 1 2 5 4 7
#内循环后
8 1 2 5 4 7 9

虽然已经将最大的数“冒泡”到最右端,但是排序还没有结束,所以还需要一个循环,注意到,现在还没有排序的序列只有前面一段(不含9),也就是

#还未排序的序列
8 1 2 5 4 7

所以接下来我们要对前一段序列进行排序,这跟我们之前的需求是一样的,所以仍然可以借用内循环实现,但是要注意这个时候,内循环的指针i只能指到倒数第二个数(当然指到最后一个也可以达到相同目标,但是时间复杂度会增加,接下来会提到)。上面我们是通过两个循环来实现的,在分析的过程中,第一次排序和第二次排序都是借助于相同的代码实现的,所以很容易想到能否通过调用函数来实现?答案是可以的,代码如下

#冒泡排序算法(函数实现)
#输入数据
x=input("请输入一个待排序列,相邻数字用空格分隔开:\n")
#数据的简单处理
x=x.split()#删掉空格,返回列表
x=[int(val) for val in x]#将列表中元素类型变成int型
#排序算法主题
def sortfun(x):
    #x是一个待排序列
    for i in range(len(x)-1):
        if x[i]>x[i+1]:
            y=x[i]
            x[i]=x[i+1]
            x[i+1]=y
    return x
re=list()#输出最后的结果
while x:
    x=sortfun(x)
    re.append(x.pop())
#数据的输出
#注意此时re里面的元素正好是从大到小排列的
#简单的调整一下,变成从小到大的顺序排列,当然也可以在函数判断语句那里修改成小于号
re2=[]
while re:
    re2.append(re.pop())
print(re2)

看一下结果
在这里插入图片描述
————————————————————————————
关于算法的实现就介绍到这了,关于冒泡排序算法复杂度的博客有很多,这里就不多说了(冒泡排序算法的复杂度
————————————————————————————
这里主要说一下排序算法的稳定性(因为我在一次面试中被 问到过,那时候不太懂,就很尴尬 )

假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称
这种排序算法是稳定的;否则称为不稳定的。

通俗的讲,比如待排序列如下

5 6(l) 6(L) 9 3 2 1

这里有两个6,我们把第一个6叫做小6,第二个六叫做大6,一个合适的排序算法排序后的结果如下

1 2 3 5 6 6 9

稳定性关心的是6(相同元素)的相对位置顺序,在待排序列中,小6在大6的左边,在排序之后,小6和大6的相对位置关系是怎样的,这就是评价算法稳定性的指标。

1 2 3 5 6(l) 6(L) 9

上面这种结果就说明算法是稳定的(小6仍然在大6的左边,家庭依旧和睦)。

1 2 3 5 6(L) 6(l) 9

上面这种结果就说明该排序算法不是稳定的(大6跑到了小6的左边,破坏了人家“家庭的和睦”),所以算法是不稳定的。
—————————————————————————————
回到我们冒泡排序算法,那么冒泡排序算法是不是稳定的呢?答案是肯定的!

为什么呢?很容易分析,冒泡排序算法的核心在于交换,交换的条件是什么?是左边大于右边才交换,若遇到相同的数,是不会触发交换的,所以相对位置也就不会发生变化,也就说明冒泡排序算法是稳定的!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值