冒泡排序实现及优化

冒泡排序是一种基础排序算法,通过相邻元素比较并交换来逐步排序。文章介绍了冒泡排序的工作原理,强调了在最后一轮比较时的优化,避免了不必要的比较。此外,还提出了一种优化方案,通过标记变量haveSorted来判断是否已排序,从而在数组部分有序或存在重复元素时提高排序效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

冒泡排序:

相邻元素比较,符合条件交换位置,每轮比较会得到一个最大或者最小的值。数组有多少个元素就需要比较几轮,但是倒数一轮比较的时候数组已经排好序了,即最后一轮比较是多余的,因此共比较(arr.lenth-1)轮。每轮相邻元素比较(arr.lenth-1)次,由于每轮比较会冒出一个排好序的值,因此每轮又可以减少之前冒泡得到的元素,因此每轮只需要比较(arr.length-1-第几轮)次。实现如下:

package com.kf;

import java.util.Arrays;

/**
 * 冒泡排序(相邻元素比较,每轮比较冒出一个最大或者最小的数。如果某一次没有交换位置则说明排序完成)
 *
 * @author LeiLei
 * @date 2019/7/2
 */
public class BubbleSort {

    /**
     * 总共比较次数
     */
    private static int count = 0;

    /**
     * 数组是否已经排序完成
     */
    private static boolean haveSorted = true;

    public static void main(String[] args) {
        Integer[] arr = {3,9,4,5,2,1,8};
        //Integer[] arr = {1,1,1,1,1,1,1};
        //39 94 45 52 21 18
        //94 45 52 21 18
        //45 52 21 18
        //52 21 18
        //21 18
        //18
        //1+2+3+4+5+6 = 21次
        System.out.println("排序前:"+Arrays.toString(arr));
        int a = 0;
        //数组长度
        int length = arr.length;
        //比较(arr.lenth-1)轮
        for(int j = 0; j < length - 1;j++ ) {
            haveSorted = true;
            //每轮比较进行冒泡找出最大或最小值
            for(int i = 0; i < length - 1 - j ; i++) {
                count++;
                if(arr[i] < arr[i+1]) {
                    Integer temp = arr[i];
                    arr[i] = arr[i+1];
                    arr[i+1] = temp;
                    haveSorted = false;
                }
            }
            if(haveSorted) {
                break;
            }
        }
        System.out.println("排序后:"+Arrays.toString(arr));
        System.out.println("总共比较次数:"+count);

    }

}

优化:如果元素中的所有元素一样、或有得元素已经排好序,就会多出来很多无意义得比较。因此我加了一个haveSorted字段,假定每轮比较都是排好序得。如果进入if块则说明没有排好序,将haveSorted改为false。如果没有进入if块则说明数组已经排好序,则直接跳出循环,排序完成,这样就当元素有重复元素得时候或者数组已经有几个排好序得元素时效率会高很多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值