当前位置: 首页 > 图灵资讯 > 技术篇> 冒泡排序算法详解

冒泡排序算法详解

来源:图灵教育
时间:2023-04-07 10:20:55

  泡沫排序算法是我们学习计算机语言的入门级排序算法。在这个时候,即使我们不能记住它,我们也会在脑海中留下一点印象。顾名思义,泡沫排序,因为元素越小,它们就会通过交换慢慢进行“浮”到几列的顶部(升序或降序排列),就像碳酸饮料中的二氧化碳气泡最终会上升到顶部一样,所以它的名字“冒泡排序”。由于泡沫排序简单,通常用于向计算机程序设计入门的学生介绍算法的概念。毫不夸张地说,泡沫排序是我们学到的启蒙老师的排序算法。

  泡沫排序的原理(以递增序为例)是两个相邻元素,每次从头开始。如果后一个元素比前一个大,说明顺序不对,就交换。这个循环完成后,再次从头开始扫描,直到扫描中没有元素交换,说明每个元素都不比后面的元素大。泡沫排序是向前调整小元素或向后调整大元素。比较是两个相邻元素的比较,交换也发生在这两个元素之间。根据我们的算法,如果两个相等元素相邻。它们之间没有交换;如果两个相等元素不相邻,即使前两个交换相邻,此时也不会交换,因此相同元素的前后顺序没有改变,因此泡沫排序是一种稳定的排序算法。

  时间复杂性是衡量算法效率的标准值。让我们计算一下泡沫排序的时间复杂性:

  如果文件的初始状态是正序的,则可以通过扫描完成排序。所需的关键字比较次数和记录的移动次数达到最小值:因此,泡沫排序的最佳时间复杂性是0(n);

  如果初始文件反序,则需要执行n-1排序。每次排序都要进行。n-i二次关键词比较(1≤i≤n-1),每次比较必须移动记录三次才能达到交换记录的位置。在这种情况下,比较和移动次数达到最大值,泡沫排名最坏的时间复杂度是0(n²);

  综上所述,泡沫排序的平均时间复杂度为0(n²)。

  通过实例,我们可以快速掌握冒泡排序的规则和算法:

  冒泡排序的算法规则是两个相邻的数字,正序不动,倒序交换位置,这样循环,直到整个数组有序。

  以下数据为例:

  首先,比较索引是0和1的值

  3>2,为倒序,位置交换

  再比较索引1和2的值,3<7,为正序,位置不变

  再比较索引2和3的值,7>4,为倒序,位置交换

  再比较索引3和4的值,7>1,为倒序,位置交换

  这个时候,最后一个已经遍历了(length-1)第一轮位置交换结束

  总结:href="">1. 由于是依次比较和交换值,目前数组中最大值已被放置在最后位置

  然后下一个排名不需要经历到最后一个,因为最大值已经排到了最后第二轮比较

  数组中的最大值已经放在最后,所以第二轮比较可以忽略最后一个,比较前面的值(length-1-1)即可。

  重复第一轮操作,首先,比较索引是0和1的值。

  2<3,为正序,位置不变

  再比较索引1和2的值,3<4,为正序,位置不变

  再比较索引2和3的值,4>1,为倒序,位置交换

  此时已经遍历了”7”之前的数(leng-1-1)第二轮结束

  第二轮总结:

  1.因为不考虑已经排名好的7,第二轮已经除以最后一轮了(leng-1-1)数组中最大值交换到最后位置

  2.那么下一个排名不需要遍历最后两位,因为最大的两个值已经排到最后了 第三轮比较

  数组中最大值的两个值已经放在最后,所以第三轮比较可以忽略最后两位,比较前面的值(leng-1-2)即可,重复第一轮操作,首先,比较索引是0和1的值。

  2<3,为正序,位置不变

  再比较索引1和2的值,3>1,为倒序,位置交换

  此时已经遍历了”4”和”7”之前的数(leng-1-2)第二轮结束

  第三轮总结:

  1.因为不考虑已经排名好的4和7,第三轮已经排除了最后两个了(leng-1-2)数组中最大值交换到最后位置。

  2.那么下一个排名不需要遍历最后三位,因为最大的三个值已经排到最后了。 第四轮比较

  数组中最大值的三个值已经放在最后,所以第四轮比较可以忽略最后三位,比较前面的值(leng-1-3)即可,重复第一轮操作,首先,比较索引是0和1的值

  2>1,为倒序,位置交换

  此时已经遍历了”3”和”4”和”7”之前的数(leng-1-3)最后一轮结束

  第四轮(最后一轮)总结:

  1.第四轮将排除最后三名,因为不考虑已经排名好的3、4、7(leng-1-3)数组中最大值交换到最后位置

  2.此时遍历结束,数组已经是有序数组了 =代码实现==

  publicclassSort{

  publicstaticvoidmain(String[]args){

  //示例数据intarr[]={3,2,7,4,1};

  System.out.println("====Before====");

  System.out.println(Arrays.toString(arr));

  //进行排序BubbleSort(arr);

  //显示结果System.out.println("====After====");

  System.out.println(Arrays.toString(arr));

  }

  //冒泡排序publicstaticvoidBubbleSort(intarr[]){

  inttemp;

  for(inti=0;i

  for(intj=0;j

  if(arr[j]>arr[j+1]){

  temp=arr[j];

  arr[j]=arr[j+1];

  arr[j+1]=temp;

  }

  }

  }

  }} ==代码描述==

  整个数组从第一个位置开始遍历,使用嵌套循环,外层表示排序次数,n个数只需要n-1次,内循环将当前值与后一值进行比较,当前值大于后一位值(倒序)时,交换位置,这样一来,内循环是将当前比较数组的最大值放在最后位置,外循环完成后,所有数字都被排序。

  冒泡排序作为最基本的经典排序算法,不仅适用于java语言,几乎所有的主流开发语言都可以使用。泡沫排序是我们学习其他排序算法的向导,也是我们学习计算机算法的基石。只有奠定坚实的基础,我们才能在未来的学习和发展中不担心。