泡沫排序算法是我们学习计算机语言的入门级排序算法。在这个时候,即使我们不能记住它,我们也会在脑海中留下一点印象。顾名思义,泡沫排序,因为元素越小,它们就会通过交换慢慢进行“浮”到几列的顶部(升序或降序排列),就像碳酸饮料中的二氧化碳气泡最终会上升到顶部一样,所以它的名字“冒泡排序”。由于泡沫排序简单,通常用于向计算机程序设计入门的学生介绍算法的概念。毫不夸张地说,泡沫排序是我们学到的启蒙老师的排序算法。
泡沫排序的原理(以递增序为例)是两个相邻元素,每次从头开始。如果后一个元素比前一个大,说明顺序不对,就交换。这个循环完成后,再次从头开始扫描,直到扫描中没有元素交换,说明每个元素都不比后面的元素大。泡沫排序是向前调整小元素或向后调整大元素。比较是两个相邻元素的比较,交换也发生在这两个元素之间。根据我们的算法,如果两个相等元素相邻。它们之间没有交换;如果两个相等元素不相邻,即使前两个交换相邻,此时也不会交换,因此相同元素的前后顺序没有改变,因此泡沫排序是一种稳定的排序算法。
时间复杂性是衡量算法效率的标准值。让我们计算一下泡沫排序的时间复杂性:
如果文件的初始状态是正序的,则可以通过扫描完成排序。所需的关键字比较次数和记录的移动次数达到最小值:因此,泡沫排序的最佳时间复杂性是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语言,几乎所有的主流开发语言都可以使用。泡沫排序是我们学习其他排序算法的向导,也是我们学习计算机算法的基石。只有奠定坚实的基础,我们才能在未来的学习和发展中不担心。