八排序之冒泡排序

冒泡排序

冒泡排序 两层循环 外层冒泡轮数,里层依次比较 时间复杂度O(n^2)

import java.util.Arrays;

public class ArrayDemo07 {
    public static void main(String[] args){
        System.out.println("Hello World !");

        //八大排序之 冒泡排序
        int[] arrays = {12,89,45,32,6,4,9,45};
        int[] arrays1 = {9,8,7,6,5,4,3,2,1};
//        int[] x = sort(arrays);
//        System.out.println(Arrays.toString(x));

        System.out.println(Arrays.toString(sort(arrays)));
        System.out.println("--------------------");
        System.out.println(Arrays.toString(sort1(arrays)));
        System.out.println("********");
        System.out.println(Arrays.toString(sort2(arrays1)));

    }

    //写一个冒泡排序的方法
    //不理解为什么这么写的话 ,画图自己走一遍
    public static int[] sort(int[] arrays){
        int temp = 0;
        //外层循环,判断要走多少次
        for (int i = 0; i < arrays.length-1; i++) {     //这里需要-1 否则下标越界因为数组下标是从0开始的
                                                        // 仔细去想(本来长度7,两两比较6次,不减1的话 <7  0-6 比较7次)
                                                        //减去1的话,<6  0-5 比较6次才正确
            //内层循环  如果第一个数比第二个数大,交换位置       交换位置要借助第三者临时变量
            for (int j = 0; j < arrays.length-1-i; j++) {                   //不理解的话 ,画图自己走一遍
                if (arrays[j+1] > arrays[j]){       //从大到小排序
                    temp = arrays[j+1];
                    arrays[j+1] = arrays[j];
                    arrays[j] = temp;
                }
            }

        }

        //第一个循环是一共要比较的轮数,第二个循环是数与数之间需要比较的次数

        return arrays;
    }

    //从小到大 冒泡排序
    public static int[] sort1(int[] arrays){
        int temp1 = 0;
        for (int i = 0; i < arrays.length-1; i++) {
            for (int j = 0; j < arrays.length-1-i; j++) {
                if (arrays[j] > arrays[j+1]){
                    temp1 = arrays[j];
                    arrays[j] = arrays[j+1];
                    arrays[j+1] = temp1;
                }
            }
        }
        return arrays;
    }


    //改进:从大到小的冒泡排序
    //适用一开始就是从大到小的数组,就不用排序
    public static int[] sort2(int[] arrays){
        int temp = 0;
        //外层循环,判断要走多少次
        for (int i = 0; i < arrays.length-1; i++) {
            boolean flag = false;
            for (int j = 0; j < arrays.length-1-i; j++) {
                if (arrays[j+1] > arrays[j]){       //从大到小排序
                    temp = arrays[j+1];
                    arrays[j+1] = arrays[j];
                    arrays[j] = temp;
                    flag = true;
                }
            }
            if (flag == false){
                break;
            }
        }

        return arrays;
    }
}

posted @ 2022-03-22 18:34  intelliyu  阅读(31)  评论(0编辑  收藏  举报