为什么冒泡排序叫做冒泡排序?
冒泡排序的排序方法像汽水冒泡一样,小气泡一直不停的往上浮。冒泡排序叫做冒泡排序的原因在于在这种排序算法会把排序的元素当成小气泡,根据数值大小,一点一点向着数组的一侧移动。
冒泡排序的移动方式如下:
冒泡排序可以快速编写,在排序元素比较少时比较管用。
冒泡排序的引用场景和使用方式
适用于:数据量不大,并且对稳定性有要求,基本有序的情况
N个数字来排队 两两相比小靠前 外层循环N-1 内层循环N-1-i (i从0开始)
冒泡排序的过程
冒泡排序,类似于水中冒泡,较大的数沉下去,较小的数慢慢冒起来,假设从小到大,即为较大的数慢慢往后排,较小的数慢慢往前排。每一趟遍历,将一个最大的数移到序列末尾。
冒泡排序的实现:
for ( int i = 0; i < len; i++) {
for ( int j = 0; j < len - 1 - i; j++) {
if (arr[j] > arr[j+1]) { //相邻元素两两对比
int temp = arr[j+1]; //元素交换
arr[j+1] = arr[j];
arr[j] = temp;
}
冒泡排序的改进:
如果序列已经是有序的,可以优化冒泡排序的方法。
具体做法为判断每次排序时是否交换过元素,如果没有,证明有序,排序结束。
优化代码如下:
public class Bubble {
public static void main(String[] args){
int[] arr = new int[]{44,3,38,5,47,15,36,26,27,2,46,4,19,50,48};
int count =0;//排序计数器
int changId =0;//每次排序的元素位置计数器
int temp = 0; //比较两个值大小时交换位置用的临时变量
int ifSwap =0;//比较每次排序过程中是否交换过元素,0-未交换
for(count =arr.length-1;count>0;count--){
//一共进行了长度-1次比较
for(changId=0;changId<count;changId++){
//每次仅需要比较0...总量-排序次数的元素,后面的元素是排好的
{
if(arr[changId]>arr[changId+1]){
temp = arr[changId+1];
arr[changId+1]=arr[changId];
arr[changId] =temp;
ifSwap =1;//设置交换标志
}
if(ifSwap==0) return;
}
}
for(int i=0;i<arr.length;i++){
System.out.print(arr[i]+",");
}
}
}
}