• 冒泡排序


    冒泡排序

    基本介绍

    冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水底下的气泡一样逐渐
    向上冒。

    算法优化

    因为排序的过程中,各元素不断接近自己的位置,如果一趟比较下来没有进行过交换,就说明序列有序,因此要在排序过程中设置一个标志flag判断元素是否进行过交换。从而减少不必要的比较。

    算法过程

    原始数组:3, 9, -1, 10, 20
    
    第一趟排序
    (1)  3, 9, -1, 10, 20   // 如果相邻的元素逆序就交换
    (2)  3, -1, 9, 10, 20
    (3)  3, -1, 9, 10, 20
    (4)  3, -1, 9, 10, 20
    
    第二趟排序
    (1) -1, 3, 9, 10, 20 //交换
    (2) -1, 3, 9, 10, 20
    (3) -1, 3, 9, 10, 20
    
    第三趟排序
    (1) -1, 3, 9, 10, 20
    (2) -1, 3, 9, 10, 20
    
    第四趟排序
    (1) -1, 3, 9, 10, 20
    
    
    小结冒泡排序规则
    (1) 一共进行 数组的大小-1 次 大的循环
    (2)每一趟排序的次数在逐渐的减少
    (3) 如果我们发现在某趟排序中,没有发生一次交换, 可以提前结束冒泡排序。这个就是优化
    
      
    
    

    推导过程

    import java.util.Arrays;
    public class bubbleSort01 {
        public static void main(String[] args) {
            int []arr={9,-1,20,3,2};
            System.out.println("排序前:");
            System.out.println(Arrays.toString(arr));
            int temp=0;
            //冒泡排序-升序
            for (int i = 0; i < arr.length - 1-0; i++) {
                if(arr[i]>arr[i+1]){
                    temp=arr[i];
                    arr[i]=arr[i+1];
                    arr[i+1]=temp;
                }
            }
            System.out.println("第一趟排序后:");
            System.out.println(Arrays.toString(arr));
            //冒泡排序-升序
            for (int i = 0; i < arr.length-1-1; i++) {
                if(arr[i]>arr[i+1]){
                    temp=arr[i];
                    arr[i]=arr[i+1];
                    arr[i+1]=temp;
                }
            }
            System.out.println("第二趟排序后:");
            System.out.println(Arrays.toString(arr));
            //冒泡排序-升序
            for (int i = 0; i < arr.length-1-2; i++) {
                if(arr[i]>arr[i+1]){
                    temp=arr[i];
                    arr[i]=arr[i+1];
                    arr[i+1]=temp;
                }
            }
            System.out.println("第三趟排序后:");
            System.out.println(Arrays.toString(arr));
            //冒泡排序-升序
            for (int i = 0; i < arr.length-1-3; i++) {
                if(arr[i]>arr[i+1]){
                    temp=arr[i];
                    arr[i]=arr[i+1];
                    arr[i+1]=temp;
                }
            }
            System.out.println("第四趟排序后:");
            System.out.println(Arrays.toString(arr));
        }
    }
    
    

    推导结论

     public static void main(String[] args) {
            int[] arr = {9, -1, 20, 3, 2};
            System.out.println("排序前:");
            System.out.println(Arrays.toString(arr));
            int temp = 0;
            for (int i = 0; i <arr.length-1 ; i++) {
                for (int j = 0; j < arr.length-1-i; j++) {
                    if(arr[j]>arr[j+1]){
                        temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=temp;
                    }
                }
                System.out.println("第"+(i+1)+"排序后:");
                System.out.println(Arrays.toString(arr));
            }
    
        }
    

    代码优化

    public static void main(String[] args) {
            int[] arr = {9, -1, 20, 3, 2};
            System.out.println("排序前:");
            System.out.println(Arrays.toString(arr));
            int temp = 0;
            boolean flag = false;//比较标识符
            for (int i = 0; i <arr.length-1 ; i++) {
                for (int j = 0; j < arr.length-1-i; j++) {
                    if(arr[j]>arr[j+1]){
                        flag=true;
                        temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=temp;
                    }
                }
                System.out.println("第"+(i+1)+"排序后:");
                System.out.println(Arrays.toString(arr));
                if(!flag){
                    break;
                }else{
                    flag=false;
                }
            }
    
        }
    

    封装算法

    package com.javaee.sort;
    
    import java.util.Arrays;
    
    public class bubbleSort01 {
    
        public static void main(String[] args) {
            int[] arr = {9, -1, 20, 3, 2};
            System.out.println("排序前:");
            System.out.println(Arrays.toString(arr));
            System.out.println("排序后:");
            bubbleSort(arr);
            System.out.println(Arrays.toString(arr));
        }
        public static void bubbleSort(int []arr){
            int temp = 0;
            boolean flag = false;//比较标识符
            for (int i = 0; i <arr.length-1 ; i++) {
                for (int j = 0; j < arr.length-1-i; j++) {
                    if(arr[j]>arr[j+1]){
                        flag=true;
                        temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=temp;
                    }
                }
                if(!flag){
                    break;
                }else{
                    flag=false;
                }
            }
        }
    }
    
    

    时间测试

    import java.text.SimpleDateFormat;
    import java.util.Arrays;
    import java.util.Date;
    
    public class bubbleSort01 {
    
        public static void main(String[] args) {
            final int length =20000;
    //        int[] arr = {9, -1, 20, 3, 2};
            int []arr=new int[length];
            for (int i = 0; i < length; i++) {
                arr[i]=(int)(Math.random()*length);
            }
            Date date1 = new Date();
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            String s1 = format.format(date1);
            System.out.println("排序前时间:");
            //System.out.println(Arrays.toString(arr));
            System.out.println(s1);
            bubbleSort(arr);
            Date date2 = new Date();
            String s2 = format.format(date2);
            System.out.println("排序后时间:");
            //System.out.println(Arrays.toString(arr));
            System.out.println(s2);
        }
        public static void bubbleSort(int []arr){
            int temp = 0;
            boolean flag = false;//比较标识符
            for (int i = 0; i <arr.length-1 ; i++) {
                for (int j = 0; j < arr.length-1-i; j++) {
                    if(arr[j]>arr[j+1]){
                        flag=true;
                        temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=temp;
                    }
                }
                if(!flag){
                    break;
                }else{
                    flag=false;
                }
            }
        }
    }
    
    

    比较次数与交换次数

      public static void bubbleSort(int []arr){
            int compare = 0;//比较次数
            int change=0;//比较次数
            int temp = 0;
            boolean flag = false;//比较标识符
            for (int i = 0; i <arr.length-1 ; i++) {
                for (int j = 0; j < arr.length-1-i; j++) {
                    compare++;
                    if(arr[j]>arr[j+1]){
                        flag=true;
                        change++;
                        temp=arr[j];
                        arr[j]=arr[j+1];
                        arr[j+1]=temp;
                    }
                }
                if(!flag){
                    break;
                }else{
                    flag=false;
                }
            }
            System.out.println("冒泡排序比较次数:"+compare);
            System.out.println("冒泡排序交换次数:"+change);
        }
    
  • 相关阅读:
    超级迷宫我的计划表
    不敢死队
    Let the Balloon Rise
    Hangover
    汉诺塔系列2
    Tri Tiling(递推)
    Tiling(递推,高精度)
    Color Me Less
    I Think I Need a Houseboat(圆计算)
    Kbased Numbers(递推)
  • 原文地址:https://www.cnblogs.com/wanwanyuan/p/14327693.html
Copyright © 2020-2023  润新知