冒泡排序算法

冒泡排序

思路:相邻位比较,反序则互换

img

结论:

  • 每一轮比较后都会将最大值(最小值)放置在序列尾端,且这个值就已经有序

  • 因为每轮都会产生一个有序值,所以每一轮比较与前一轮比较相比都会少一次比较

  • 如果待排序序列长度为N,则一共要进行N-1轮比较

  • 假设冒泡排序的轮次从第0轮开始计算,那么第i轮排序开始的时候,序列当中就有i个元 素是有序的,本轮就会执行n-i-1次比较

代码实现:

public void sort(int[] array){
    int tmp;
    //外层要n-1层循环,array.length就是n,i < array.length - 1 就是n-1
    for (int i = 0 ;i < array.length - 1 ; i++){
        //内层循环每轮会少一个,因为每轮就排好了一个
        for (int j = 0 ; j + 1 <= array.length-i-1 ; j ++ ){
            if (array[j] > array[j+1]){
                tmp = array[j];
                array[j] = array[j+1];
                array[j+1] = tmp;
            }
        }
    }
}

冒泡排序的优化:

思路:

如果在执行冒泡排序的某一轮排序操作的过程当中,没有任何元素发生交换,则表示当前序列已 经是完全有序状态了,后续轮次的比较没有意义继续执行。我们可以定义一个boolean类型的临 时变量标记位,在每一轮排序开始之前置为false,表示尚且没有元素发生交换;如果在这一轮 当中有元素进行交换,则在交换之后将这个标记位置为true。在一轮排序结束之后,对标记位进 行判断:如果标记位取值依然为false,则表示可以直接退出排序算法。

public void sort2(int[] array){
    int tmp;
    boolean flag;
    for (int i = 0 ;i < array.length - 1 ; i++){
        flag = false; //判断每一轮是否有元素值交换
        for (int j = 0 ; j + 1 <= array.length-1-i ; j ++ ){
            if (array[j] > array[j+1]){
                tmp = array[j];
                array[j] = array[j+1];
                array[j+1] = tmp;
                flag = true;
            }
        }
        if (!flag){ //如果没有元素交换,直接return(没有交换说明已经有序了)
            return;
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值