数据结构:Python实现冒泡排序(1)

1.什么是冒泡排序:
冒泡排序(Bubble Sort)是一种交换排序,它重复地走访过要排序的元素,依次比较两个相邻的元素,一层一层的将较大的元素往后移动,其现象和气泡在上升过程中慢慢变大类似,故成为冒泡排序。

2.算法思想
1,从第一个和第二个开始比较,如果第一个比第二个大,则交换位置,然后比较第二个和第三个,逐渐往后,
2,经过第一轮后最大的元素已经排在最后,所以重复上述操作的话第二大的则会排在倒数第二的位置。
3,那重复上述操作n-1次即可完成排序,因为最后一次只有一个元素所以不需要比较

假设有一个大小为 N 的无序序列。以升序冒泡排序为例,冒泡排序就是要每趟排序过程中通过两两比较相邻元素,将小的数字放到前面,大的数字放在后面。
例如:
输入:5,4,1,3,2
输出:1,2,3,4,5

此时无序序列为{5,4,1,3,2}

Python3代码实现:

# -*- coding: utf-8 -*-
"""
Created on Sun Jul  7 17:24:03 2019

@author: ZQQ
"""

def bubbleSort(input_list):
    '''
    函数说明:冒泡排序(升序)
    Parameters:
        input_list - 待排序的列表
    Returns:
        sorted_list - 升序排序后的列表
    '''
    if len(input_list) == 0:
        return []                            # 第一层for表示循环的遍数
    else:                                    # 外循环,每次使得有序的数增加一个 
        for i in range(len(input_list) - 1): # 这个循环负责设置冒泡排序的次数,n个数要进行n-1次冒泡
            print('第%d趟排序:' % (i + 1))
            for j in range(len(input_list) - i - 1): # j为列表下标 # 第二层for表示具体比较哪两个元素
                if input_list[j] > input_list[j + 1]:
                    input_list[j], input_list[j + 1] = input_list[j + 1], input_list[j]
                print(input_list)
        return input_list

input_list = [5,4,1,3,2]
print('排序前:',input_list)
sorted_list = bubbleSort(input_list)
print('排序后:',sorted_list)

在这里插入图片描述
3.算法分析
在这里插入图片描述
时间复杂度
在这里插入图片描述
时间复杂度:因为它需要双层循环n*(n-1)),所以平均时间复杂度为O(n^2)
空间复杂度:只需要常数个辅助单元,所以空间复杂度为O(1),我们把空间复杂度为O(1)的排序成为原地排序(in-place)

算法稳定性:
冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法

4.优化
当我们在进行技术面的时候,不能只是简单的实现某个算法功能,还要考虑算法的复杂性,对算法进行优化,当然,这部分会比较难,但是这也是算法工程师的必备技能。

对冒泡排序常见的改进方法是加入标志性变量exchange,用于标志某一趟排序过程中是否有数据交换。
如果进行某一趟排序时并没有进行数据交换,则说明所有数据已经有序,可立即结束排序,避免不必要的比较过程。

# -*- coding: utf-8 -*-
"""
Created on Mon Jul  8 10:08:42 2019

@author: ZQQ
"""
import random

def bubbleSort_plus(input_list):
    '''
    函数说明:冒泡排序(升序)
    参数:
        input_list:待排序的列表
    Returns:
        sorted_list:升序排序好的列表    
    '''
    if len(input_list) == 0:
        return []
    else:
        for i in range(len(input_list) - 1): # 负责设置冒泡排序进行的次数(比如说n个数,则只要进行n-1次冒泡,就可以把这个n个数排序好)
            exchange = False # 用于优化,没有交换时表示已经有序,结束循环
            for j in range(len(input_list) - i - 1): 
                """
                这里这个j呢就是控制每一次具体的冒泡过程,请你想一想,我们第一次冒泡需要冒几次,也就是说需要比较几次,
                假如有三个数,那只需要两次就可以了,当下一次时,最后一个
                已经是有序的了,所以说少冒泡一次,所以这里j每次都会减去i的值,即不用冒“无用之泡泡”
                """   
                if input_list[j] > input_list[j + 1]:
#                    input_list[j] = input_list[j + 1]
#                    input_list[j + 1] = input_list[j]  # 这样会导致数据丢失
                    input_list[j], input_list[j + 1] = input_list[j + 1], input_list[j]
                    exchange = True
            if not exchange:
                break
        return input_list
    
input_list = list(range(10))#产生一个有序列表
random.shuffle(input_list) # 调用shuffle函数打乱顺序
print(input_list)# 排序前
res = bubbleSort_plus(input_list)# 调用冒泡排序算法
print(res)

input_list = [5,4,1,3,2]
print('排序前:',input_list)
sorted_list = bubbleSort_plus(input_list)
print('排序后:',sorted_list)
                    

冒泡排序是一种简单直接暴力的排序算法,为什么说它暴力?因为每一轮比较可能多个元素移动位置,而元素位置的互换是需要消耗资源的,所以这是一种偏慢的排序算法,仅适用于对于含有较少元素的数列进行排序。

降序的话,根据比较值的大小,交换的位置换一下即可。

引用以及参考:
https://cuijiahua.com/blog/2017/12/algorithm_1.html

http://www.cnblogs.com/jingmoxukong/p/4302718.html

https://www.cnblogs.com/SteveWesley/p/10007987.html

代码实现彩色参考:
https://blog.csdn.net/qq_42351033/article/details/86632994

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器不学习我学习

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值