排序_冒泡排序

package com.zsx.algorithm.sort;

import java.util.Arrays;

/**
 * @author Zsx
 * 冒泡排序
 * 双层嵌套循环,时间复杂度 O(n^2)
 * 判断过程示例:
 * 初始数据:[6,5,4,3,2,1]
 * 从小到大排序
 * 第一遍排序:遍历 长度=length 的数组,将大的和小的通过临时变量交换位置,直到遍历完成,遍历后数组如下: [5,4,3,2,1,6]
 * 第二遍排序:遍历 长度=length-1 的数组,因为最大值已经是最后一个了,所以只需要遍历前面 lengt-1 ,遍历后数组如下: [4,3,2,1,5,6]
 * 第三遍排序:遍历 长度=length-2 的数组,结果:[3,2,1,4,5,6]
 * 第四遍排序:遍历 长度=length-3 的数组,结果:[2,1,3,4,5,6]
 * 第五遍排序:遍历 长度=length-4 的数组,结果:[1,2,3,4,5,6]
 * ...故执行length-1次排序,每次排序遍历只遍历前 length-1-n的数,将最大值放到遍历数据的最后一位,n再+1
 * <p>
 * 优化点:当执行某次排序的遍历,发现没有元素交替。说明已经是排好序的,则直接跳出方法
 * @Time 2021/6/18 15:10
 */
public class BubblesSort {


    public static void main(String[] args) {
        //需要排序的数组
        int[] arr = {1, 3, 2, 4, 20, 5, 7, 1, 2, 24, 9};


        System.out.println("初始数据:" + Arrays.toString(arr));
        System.out.println();

        BubblesSort bubblesSort = new BubblesSort();
        //正常排序
        bubblesSort.sort(arr);

        System.out.println();

        //优化后的排序
        bubblesSort.sort1(arr);

        System.out.println();
        System.out.println("最终结果:" + Arrays.toString(arr));
    }


    /**
     * 正常冒泡排序
     *
     * @param arr 需要排序的数组
     */
    public void sort(int[] arr) {
        //定义临时变量-->用于交换
        int temp;
        //排序过n次 -->每次排序少遍历最后的n个数据
        int n = 0;

        //执行length-1次排序
        for (int i = 0; i < arr.length - 1; i++) {

            //每次排序遍历 length - 1 - n
            for (int j = 0; j < arr.length - 1 - n; j++) {
                //元素交替
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }
            System.out.println("遍历第" + i + "次:" + Arrays.toString(arr));
            n++;
        }
    }

    /**
     * 冒泡排序优化
     *
     * @param arr 需要排序的数组
     */
    public void sort1(int[] arr) {
        //定义临时变量-->用于交换
        int temp;

        //排序过n次 -->每次排序少遍历最后的n个数据
        int n = 0;

        //是否已经排序好了
        boolean isSorted = true;

        //执行length-1次排序
        for (int i = 0; i < arr.length - 1; i++) {

            //每次排序遍历 length - 1 - n
            for (int j = 0; j < arr.length - 1 - n; j++) {
                //元素交替
                if (arr[j] > arr[j + 1]) {
                    temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;

                    //每次元素交替,isSorted就变为false
                    isSorted = false;
                }

            }
            System.out.println("遍历第" + i + "次:" + Arrays.toString(arr));
            //验证本次是否发生元素交替(也就是验证是否已经是排好序的数组)
            if (isSorted) {
                //无需再遍历
                System.out.println("第" + i + "次遍历提前完成");
                return;
            }

            //重置
            isSorted = true;
            n++;
        }
    }


}
正常排序结果:

在这里插入图片描述

优化排序结果:

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值