排序

排序

一、排序的介绍

  • 排序是指将多个数据,依指定的顺序进行排列的过程。

二、排序的分类

内部排序法

  • 指将需要处理的所有数据都加载到内部存储器中进行排序。包括(交换式排序法、选择式排序法和插入式排序法)

外部排序法

  • 数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。包括(合并排序法和直接合并排序法)

三、冒泡排序法

基本思想

  • 通过对待排序序列从前向后(从下标0开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒。

分析冒泡排序

代码实现

  • 先一轮一轮的写

  • 交换思路

public class Main {
    public static void main(String[] args) {
        //冒泡排序
        //化繁为简
        //思路:
        // 数组[24,69,80,57,13]
        //第一轮排序目标:把最大数放在最后
        //第1次比较:[24,69,80,57,13]
        //第2次比较:[24,69,80,57,13]
        //第3次比较:[24,69,57,80,13]
        //第4次比较:[24,69,57,13,80]
        //和后一个比较   arr[i] > arr[i+1]

        int[] arr = {24,69,80,57,13};
        int temp = 0;//用于辅助交换的变量
        //如果前面的数 > 后面的数,就交换
        for(int j = 0;j < 4;j++){
            if(arr[j] > arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
        for (int j = 0;j < arr.length;j++){
            System.out.print(arr[j]+" ");
        }
        System.out.println();


        //第二轮排序目标:把第二大数放在倒数第二
        //第1次比较:[24,69,57,13,80]
        //第2次比较:[24,57,69,13,80]
        //第3次比较:[24,57,13,69,80]
        for(int j = 0;j < 3;j++){
            if(arr[j] > arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
        for (int j = 0;j < arr.length;j++){
            System.out.print(arr[j]+" ");
        }
        System.out.println();



        //第三轮排序目标:把第三大数放在倒数第三
        //第1次比较:[24,57,13,69,80]
        //第2次比较:[24,13,57,69,80]
        for(int j = 0;j < 2;j++){
            if(arr[j] > arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
        for (int j = 0;j < arr.length;j++){
            System.out.print(arr[j]+" ");
        }
        System.out.println();




        //第四轮排序目标:把第四大数放在倒数第四
        //第1次比较:[13,24,57,69,80]
        for(int j = 0;j < 1;j++){
            if(arr[j] > arr[j+1]){
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        }
        for (int j = 0;j < arr.length;j++){
            System.out.print(arr[j]+" ");
        }
        System.out.println();



    }
}

  • 发现代码基本上是一样的,只是每轮执行次数不一样——————嵌套循环

public class Main {
    public static void main(String[] args) {
        //冒泡排序
        //总共执行4轮
        //第一轮   4次  4-0
        //第二轮   3次  4-1
        //第三轮   2次  4-2
        //第四轮   1次  4-3

        //先死后活————>4就是arr.length-1

        int[] arr = {24,69,80,57,13};
        int temp = 0;//用于辅助交换的变量
        for(int i = 0;i < 4;i++){//外层循环四次
            //如果前面的数 > 后面的数,就交换
            for(int j = 0;j < 4-i;j++){//4-i  非常巧妙!!
                if(arr[j] > arr[j+1]){
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            }
            System.out.println("===第"+(i+1)+"轮===");
            for (int j = 0;j < arr.length;j++){
                System.out.print(arr[j]+" ");
            }
            System.out.println();
        }
    }
}

  • 补充:在某一轮比较时,一次交换行为都没有发生,说明已经有序,可用break提前终止

如:{1,2,3,4,5}


本文章使用limfx的vscode插件快速发布