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中tell()方法的使用详解
May 24 Python
python遍历一个目录,输出所有的文件名的实例
Apr 23 Python
Python实现的简单计算器功能详解
Aug 25 Python
python安装numpy和pandas的方法步骤
May 27 Python
浅谈python中统计计数的几种方法和Counter详解
Nov 07 Python
pandas使用之宽表变窄表的实现
Apr 12 Python
解决Jupyter Notebook开始菜单栏Anaconda下消失的问题
Apr 13 Python
将keras的h5模型转换为tensorflow的pb模型操作
May 25 Python
Python读取二进制文件代码方法解析
Jun 22 Python
python pandas dataframe 去重函数的具体使用
Jul 20 Python
自定义Django_rest_framework_jwt登陆错误返回的解决
Oct 18 Python
Python制作动态字符画的源码
Aug 04 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之字符串变相相减的代码
2007/03/19 PHP
dede全站URL静态化改造[070414更正]
2007/04/17 PHP
php学习之运算符相关概念
2011/06/09 PHP
php ctype函数中文翻译和示例
2014/03/21 PHP
php编写简单的文章发布程序
2015/06/18 PHP
PHP中的表达式简述
2016/05/29 PHP
PHP页面静态化――纯静态与伪静态用法详解
2020/06/05 PHP
提高 DHTML 页面性能
2006/12/25 Javascript
jQuery 入门讲解1
2009/04/15 Javascript
JavaScript写的一个DIV 弹出网页对话框
2009/08/14 Javascript
javascript Array数组对象的扩展函数代码
2010/05/22 Javascript
JQuery自定义事件的应用 JQuery最佳实践
2010/08/01 Javascript
js Form.elements[i]的使用实例
2011/11/13 Javascript
jquery实现点击TreeView文本父节点展开/折叠子节点
2013/01/10 Javascript
一个简单的瀑布流效果(主体形式自写)
2013/05/27 Javascript
动态显示可输入的字数提示还可以输入的字数
2014/04/01 Javascript
JavaScript实现的圆形浮动标签云效果实例
2015/08/06 Javascript
JavaScript:Array类型全面解析
2016/05/19 Javascript
JavaScript DOM节点操作实例小结(新建,删除HTML元素)
2017/01/19 Javascript
JS实现图片高斯模糊切换效果的焦点图实例
2017/01/21 Javascript
解析NodeJS异步I/O的实现
2017/04/13 NodeJs
详解在vue-cli中使用graphql即vue-apollo的用法
2018/09/08 Javascript
使用angular-cli webpack创建多个包的方法
2018/10/16 Javascript
Element Input输入框的使用方法
2020/07/26 Javascript
python实现Pyecharts实现动态地图(Map、Geo)
2020/03/25 Python
Python类成员继承重写的实现
2020/09/16 Python
Jeep牧马人、切诺基和自由人零配件:4 Wheel Drive Hardware
2017/07/02 全球购物
Rag & Bone官网:瑞格布恩高级成衣
2018/04/19 全球购物
JSF如何进行表格处理及取值
2012/08/06 面试题
应届护士求职信范文
2014/01/26 职场文书
三八妇女节演讲稿
2014/05/27 职场文书
师范生求职信
2014/06/14 职场文书
机械电子工程专业求职信
2014/06/22 职场文书
大学生党员学习焦裕禄精神思想汇报
2014/09/10 职场文书
法人委托书范本
2014/09/15 职场文书
高校群众路线教育实践活动剖析材料
2014/10/10 职场文书