python算法与数据结构之冒泡排序实例详解


Posted in Python onJune 22, 2019

一、冒泡排序介绍

冒泡排序(英语:Bubble Sort)是一种简单的排序算法。它重复地遍历要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。

二、冒泡排序原理

  1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  2. 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这一步做完,最后的元素应该会是最大的数。
  3. 针对所有的元素重复以上的步骤,除了最后一个。
  4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

三、冒泡排序图解

python算法与数据结构之冒泡排序实例详解

python算法与数据结构之冒泡排序实例详解

python算法与数据结构之冒泡排序实例详解

python算法与数据结构之冒泡排序实例详解

python算法与数据结构之冒泡排序实例详解

python算法与数据结构之冒泡排序实例详解

四、冒泡排序总结

有N个数据需要比较N-1趟

每趟比较N-i次,i表示第几趟,例如7个数据,第四趟需要比较 7-4 = 3次

五、冒泡排序python代码实现

def bubble_sort(numlist):
 # 需要排列的数据个数
 N = len(numlist)
 # i 控制一共需要多少趟 N-1
 for i in range(N-1):
  # j 控制每趟需要比较多少次(因为i是从0开始,所以N-i-1)
  for j in range(N-i-1):
   # 判断j和j+1两个位置的数据大小
   if numlist[j]>numlist[j+1]:
    # 交换(交换的代码有很多种写法)
    temp = numlist[j]
    numlist[j] = numlist[j+1]
    numlist[j+1] = temp
   
list = [19,2,13,8,34,25,7]
print("排序前list = %s"%list)
bubble_sort(list)
print("排序后list = %s"%list)

运行结果为:

排序前list = [19, 2, 13, 8, 34, 25, 7]
排序后list = [2, 7, 8, 13, 19, 25, 34]

六、冒泡排序C语言代码实现

#include <stdio.h>
// 创建一个冒泡函数,需要传递一个数组,和数组的长度
void bubble_sort(int array[],int arrayLength)
{
 // i 控制一共需要循环多少趟,
 for (int i=0; i<arrayLength-1; i++)
 {
  // j 控制每趟循环多少次
  for (int j=0; j<arrayLength-i-1; j++)
  {
   //判断j和j+1位置上数的大小
   if (array[j]>array[j+1])
   {
    //交换
    int temp = array[j];
    array[j] = array[j+1];
    array[j+1] = temp;
   }
  }
 }
}

int main(int argc, const char * argv[])
{
 // 函数的声明
 void bubble_sort(int array[],int arrayLength);
 // 创建一个数组
 int numArray[] = {19,2,13,8,34,25,7};
 //进行排序
 bubble_sort(numArray,7);
 
 printf("打印排序后的数组是:\n");
 for (int i=0; i<7; i++)
 {
  printf("%d ",numArray[i]);
 }
 return 0;
}

运算结果为:

打印排序后的数组是:

2 7 8 13 19 25 34

七、冒泡排序的优化

通过上面的案例我们已经知道冒泡排序的原理和实现过程,但是在处理一些特殊数据上的时候,我们还可以对冒泡排序优化,例如:一个数组本来就是有序,1,2,3,4,5,6,7,这样的一个数组已经是正确的顺序的,我们只需要比较一趟后,发现这一趟所有的数据都没有发生改变,就说明这已经是一个正确的顺序的,后面的循环就没必要循环下去了,这样便能提高程序的效率,而我们只需要在冒泡排序的代码中,判断是否这一样都没发生交换即可。

python代码实现如下:

def bubble_sort(numlist):
 # 需要排列的数据个数
 N = len(numlist)
 # i 控制一共需要多少趟 N-1
 for i in range(N-1):
  
  # 定义一个变量,用于记录是否在本趟中发生了交换
  isChange = 0
  
  # j 控制每趟需要比较多少次(因为i是从0开始,所以N-i-1)
  for j in range(N-i-1):
   # 判断j和j+1两个位置的数据大小
   if numlist[j]>numlist[j+1]:
    # 交换(交换的代码有很多种写法)
    temp = numlist[j]
    numlist[j] = numlist[j+1]
    numlist[j+1] = temp
    # 只要发生了交换,我们就改变isChange的值为1
    isChange = 1
  
  # 只要isChange =0说明已经是正确顺序了,直接break即可
  if isChange == 0:
   break
   
list = [19,2,13,8,34,25,7]
print("排序前list = %s"%list)
bubble_sort(list)
print("排序后list = %s"%list)

运行结果为:

排序前list = [19, 2, 13, 8, 34, 25, 7]
排序后list = [2, 7, 8, 13, 19, 25, 34]

C语言代码实现如下:

#include <stdio.h>
// 创建一个冒泡函数,需要传递一个数组,和数组的长度
void bubble_sort(int array[],int arrayLength)
{
 // i 控制一共需要循环多少趟,
 for (int i=0; i<arrayLength-1; i++)
 {
  //定义一个变量,用于记录是否在本趟中发生了改变
  int isChange = 0;
  // j 控制每趟循环多少次
  for (int j=0; j<arrayLength-i-1; j++)
  {
   //判断j和j+1位置上d数的大小
   if (array[j]>array[j+1])
   {
    //交换
    int temp = array[j];
    array[j] = array[j+1];
    array[j+1] = temp;
    // 只要发生了交换,我们就改变isChange的值为1
    isChange = 1;
   }
  }
  // 只要isChange =0说明已经是正确顺序了,直接break即可
  if (isChange == 0)
  {
   break;
  }
 }
}

int main(int argc, const char * argv[])
{
 // 函数的声明
 void bubble_sort(int array[],int arrayLength);
 // 创建一个数组
 int numArray[] = {19,2,13,8,34,25,7};
 //进行排序
 bubble_sort(numArray,7);
 
 printf("打印排序后的数组是:\n");
 for (int i=0; i<7; i++)
 {
  printf("%d ",numArray[i]);
 }
 return 0;
}

运行结果为:

打印排序后的数组是:

2 7 8 13 19 25 34

八、冒泡排序的时间复杂度

最优时间复杂度:O(n) (表示遍历一次发现没有任何可以交换的元素,排序结束。)
最坏时间复杂度:O(n2)

九、冒泡排序算法的稳定性

冒泡排序就是把小的元素往前调或者把大的元素往后调。比较是相邻的两个元素比较,交换也发生在这两个元素之间。所以,如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变,所以冒泡排序是一种稳定排序算法。

侯哥语录:我曾经是一个职业教育者,现在是一个自由开发者。我希望我的分享可以和更多人一起进步。分享一段我喜欢的话给大家:"我所理解的自由不是想干什么就干什么,而是想不干什么就不干什么。当你还没有能力说不得时候,就努力让自己变得强大,拥有说不得权利。"

总结

以上所述是小编给大家介绍的python算法与数据结构之冒泡排序实例详解,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Python 相关文章推荐
Python的几个高级语法概念浅析(lambda表达式闭包装饰器)
May 28 Python
Python 使用with上下文实现计时功能
Mar 09 Python
将字典转换为DataFrame并进行频次统计的方法
Apr 08 Python
Python爬虫抓取代理IP并检验可用性的实例
May 07 Python
修改默认的pip版本为对应python2.7的方法
Nov 06 Python
python 输入一个数n,求n个数求乘或求和的实例
Nov 13 Python
python中while和for的区别总结
Jun 28 Python
python爬虫豆瓣网的模拟登录实现
Aug 21 Python
Python Web静态服务器非堵塞模式实现方法示例
Nov 21 Python
Python基于pandas爬取网页表格数据
May 11 Python
基于python实现查询ip地址来源
Jun 02 Python
python爬虫搭配起Bilibili唧唧的流程分析
Dec 01 Python
分析运行中的 Python 进程详细解析
Jun 22 #Python
机器学习实战之knn算法pandas
Jun 22 #Python
解决py2exe打包后,总是多显示一个DOS黑色窗口的问题
Jun 21 #Python
pyinstaller打包单个exe后无法执行错误的解决方法
Jun 21 #Python
pyinstaller打包多个py文件和去除cmd黑框的方法
Jun 21 #Python
解决Pyinstaller 打包exe文件 取消dos窗口(黑框框)的问题
Jun 21 #Python
十行代码使用Python写一个USB病毒
Jun 21 #Python
You might like
深入理解curl类,可用于模拟get,post和curl下载
2013/06/08 PHP
使用 PHPStorm 开发 Laravel
2015/03/24 PHP
巧妙破除网页右键禁用的十大绝招
2006/08/12 Javascript
jQuery.clean使用方法及思路分析
2013/01/07 Javascript
THREE.JS入门教程(4)创建粒子系统
2013/01/24 Javascript
如何让页面加载完成后执行js
2013/06/26 Javascript
js获取input长度并根据页面宽度设置其大小及居中对齐
2014/08/22 Javascript
jQuery判断数组是否包含了指定的元素
2015/03/10 Javascript
详解AngularJS中的表达式使用
2015/06/16 Javascript
基于JS实现简单的样式切换效果代码
2015/09/04 Javascript
简单谈谈Vue 模板各类数据绑定
2016/09/25 Javascript
jQuery实现联动下拉列表查询框
2017/01/04 Javascript
js实现楼层导航功能
2017/02/23 Javascript
原JS实现banner图的常用功能
2017/06/12 Javascript
Angular+Node生成随机数的方法
2017/06/16 Javascript
关于angularJs清除浏览器缓存的方法
2017/11/28 Javascript
在 React、Vue项目中使用SVG的方法
2018/02/09 Javascript
JavaScript实现飞舞的泡泡效果
2020/02/07 Javascript
解决vue addRoutes不生效问题
2020/08/04 Javascript
vue 防止页面加载时看到花括号的解决操作
2020/11/09 Javascript
[51:52]Liquid vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.24
2019/09/10 DOTA
pip 安装库比较慢的解决方法(国内镜像)
2019/10/06 Python
Python如何实现在字符串里嵌入双引号或者单引号
2020/03/02 Python
python 画条形图(柱状图)实例
2020/04/24 Python
pandas DataFrame运算的实现
2020/06/14 Python
基于Python制作一副扑克牌过程详解
2020/10/19 Python
详解如何在css中引入自定义字体(font-face)
2018/05/17 HTML / CSS
运动会广播稿100字
2014/01/11 职场文书
创建无烟单位实施方案
2014/03/29 职场文书
办公室主任竞聘演讲稿
2014/05/15 职场文书
岗位说明书怎么写
2014/07/30 职场文书
2015年团支书工作总结
2015/04/03 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书
2016年国庆节假期旅游工作总结
2016/04/01 职场文书
python基础之停用词过滤详解
2021/04/21 Python
【DOTA2】半决赛强强对话~ PSG LGD vs EHOME - DPC 2022 CN REGIONAL FINALS WINTER
2022/04/02 DOTA