3分钟学算法.03.冒泡排序

1 核心思想

把数组从第一项开始,依次两两比较,如果前项大于后项,则二者对换位置。

2 代码实现

import java.util.Arrays;

public class Main {
    public static void main(String[] args) {
        bubbleSort();
    }
    
    public static void bubbleSort(){
		int[] array = {3,4,5,2,1};

		System.out.println("排序前:"+Arrays.toString(array));

		for(int i = array.length - 1 ; i > 0; i--){
		    findMax(array , i);
		}
		
	}

    /*
    * 将目标数组中前i个数中最大值排到末尾
    * @param array:目标数组, i:前i个数 
    */
    public static void findMax(int[] array , int i){
        for(int j = 0 ; j < i ; j++){
	        if(array[j] > array[j+1]){
	            changePosition(array, j , j+1);
	         	System.out.println("排序后:"+Arrays.toString(array));
	        }
		}
    }
    
	public static void changePosition(int[] array, int source , int target){
		int temp = array[target];
		array[target] = array[source];
		array[source] = temp;
	}
	
}


结果:

排序前:[3, 4, 5, 2, 1]
排序后:[3, 4, 5, 2, 1]
排序后:[3, 4, 5, 2, 1]
排序后:[3, 4, 2, 5, 1]
排序后:[3, 4, 2, 1, 5]
排序后:[3, 4, 2, 1, 5]
排序后:[3, 2, 4, 1, 5]
排序后:[3, 2, 1, 4, 5]
排序后:[2, 3, 1, 4, 5]
排序后:[2, 1, 3, 4, 5]
排序后:[1, 2, 3, 4, 5]

详细解析:

排序前:[3, 4, 5, 2, 1]
 
//i=0,外部循环开始
//array[0]=3 < 4(array[1]),不换
排序后:[3, 4, 5, 2, 1]
//array[1]=4 < 5(array[2]),不换
排序后:[3, 4, 5, 2, 1]
 //array[2]=5 > 2(array[3]), 换
排序后:[3, 4, 2, 5, 1] 
//array[3]=5 >1 (array[4]),换
排序后:[3, 4, 2, 1, 5] 
//j=4 不小于 5-1-0 ,循环结束

//i=1
//array[0]=3 <4 (array[1]),不换
排序后:[3, 4, 2, 1, 5] 
//array[1]=4 > 2(array[2]),换
排序后:[3, 2, 4, 1, 5]
//array[2]=1 < 4(array[3]),不换
排序后:[3, 2, 1, 4, 5]
//j=3 不小于 5-1-1,循环结束

//i=2
//array[0]=3 > 2(array[1]),换
排序后:[2, 3, 1, 4, 5]
//array[1]=3 > 1(array[2]),换
排序后:[2, 1, 3, 4, 5]
//j=2 不小于 5-1-2,循环结束

//i=3
//array[0]=2 > 1(array[1]),换
排序后:[1, 2, 3, 4, 5]
j=1 不小于 5-1-3,循环结束

复杂度

时间复杂度:O(n²)
空间复杂度:O(1)

讲解视频(马士兵老师)

马士兵说:冒泡排序算法

上一篇,《3分钟学算法.02.选择排序》
下一篇,《3分钟学算法.04.插入排序》

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值