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之眼花缭乱的运算符
Sep 14 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
Jul 09 Python
python3 unicode列表转换为中文的实例
Oct 26 Python
Python实现数据结构线性链表(单链表)算法示例
May 04 Python
Django框架实现分页显示内容的方法详解
May 10 Python
Python3+OpenCV2实现图像的几何变换(平移、镜像、缩放、旋转、仿射)
May 13 Python
Python如何筛选序列中的元素的方法实现
Jul 15 Python
Python hashlib加密模块常用方法解析
Dec 18 Python
pytorch实现focal loss的两种方式小结
Jan 02 Python
Python3操作MongoDB增册改查等方法详解
Feb 10 Python
如何利用Python给自己的头像加一个小国旗(小月饼)
Oct 02 Python
python自动化办公操作PPT的实现
Feb 05 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
用PHP实现WEB动态网页静态
2006/10/09 PHP
Mysql和网页显示乱码解决方法集锦
2008/03/27 PHP
模板引擎正则表达式调试小技巧
2011/07/20 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
2016/05/19 PHP
js trim函数 去空格函数与正则集锦
2009/11/20 Javascript
textarea 控制输入字符字节数(示例代码)
2013/12/27 Javascript
提升PHP安全:8个必须修改的PHP默认配置
2014/11/17 Javascript
jQuery中filter()方法用法实例
2015/01/06 Javascript
鼠标事件的screenY,pageY,clientY,layerY,offsetY属性详解
2015/03/12 Javascript
分享javascript实现的冒泡排序代码并优化
2016/06/05 Javascript
AngularJS中实现动画效果的方法
2016/07/28 Javascript
浅谈JavaScript异步编程
2017/01/20 Javascript
详解在Angularjs中ui-sref和$state.go如何传递参数
2017/04/24 Javascript
Vue2.0 事件的广播与接收(观察者模式)
2018/03/14 Javascript
javascript异步处理与Jquery deferred对象用法总结
2019/06/04 jQuery
vue项目初始化到登录login页面的示例
2019/10/31 Javascript
[19:15]DK战队纪录片
2014/09/02 DOTA
[47:39]2018DOTA2亚洲邀请赛 3.31 小组赛 A组 LGD vs OPTIC
2018/03/31 DOTA
[50:02]完美世界DOTA2联赛PWL S2 Magma vs FTD 第三场 11.29
2020/12/03 DOTA
Python实现批量把SVG格式转成png、pdf格式的代码分享
2014/08/21 Python
python编码总结(编码类型、格式、转码)
2016/07/01 Python
Python subprocess模块详细解读
2018/01/29 Python
Python内置函数reversed()用法分析
2018/03/20 Python
python 异或加密字符串的实例
2018/10/14 Python
学习python分支结构
2019/05/17 Python
浅谈Django QuerySet对象(模型.objects)的常用方法
2020/03/28 Python
python合并多个excel文件的示例
2020/09/23 Python
购买英国原创艺术:Art Gallery
2018/08/25 全球购物
接收函格式
2015/01/30 职场文书
幼师求职自荐信
2015/03/26 职场文书
2015年市场营销工作总结
2015/07/23 职场文书
公司费用报销管理制度
2015/08/04 职场文书
银行安全保卫工作总结
2015/08/10 职场文书
基于Python实现的购物商城管理系统
2021/04/27 Python
拒绝盗图!教你怎么用python给图片加水印
2021/06/04 Python
Windows Server 2019 域控制器安装图文教程
2022/04/28 Servers