• 冒泡排序


    在github上看到了一个非常好的项目,用动画来解释十大排序算法,非常便于理解,准备边学习边记录下来,便于日后复习。附上原文链接:https://github.com/MisterBooo/Article

    1 算法步骤    

      设数组长度为N,需要按照从小到大排列

      1)比较相邻的前后二个数据,如果前面数据大于后面的数据,就将二个数据交换;

      2)这样对数组的第0个数据到N-1个数据进行一次遍历后,最大的一个数据就“沉”到数组第N-1个位置;

      3)N=N-1,如果N不为0就重复前面二步,否则排序完成。  

    2 动画演示

      

    3 参考代码

    package com.tcxpz.sort1;
    /**
     * 冒泡排序算法
     * @author jgp QQ:1072218420
     *
     */
    public class BubbleSort1{
        public static void main(String[] args) {
            int[] arr = new int[]{5,4,2,3,8};
            System.out.print("排序前:");
            for(int num:arr)
                System.out.print(num+" ");
            System.out.println();
            //进行排序
            int[] bubble_arr = sort(arr);
            System.out.print("排序后:");
            for(int num:bubble_arr)
                System.out.print(num+" ");
        }
        //冒泡排序算法
        private static int[] sort(int[] arr) {
            for (int i=1;i<arr.length;i++) {
                for(int j=0;j<arr.length-i;j++){
                    if(arr[j]>arr[j+1]){
                        int temp = arr[j];
                        arr[j] = arr[j+1];
                        arr[j+1] = temp;
                    }
                }
            }
            return arr;
        }       
    }

     4 算法改进

      上面的算法很明显存在一个问题:不管给你一个什么样的数组(假设长度为n),你都要比较n(n-1)/2次。即使该数组已经有序,你也要比较n次。下面对其进行优化,设置一个标志,如果这一趟发生了交换,则为true,否则为false。明显如果有一轮循环没有发生交换,说明排序已经完成。   

    package com.tcxpz.bubble;
    /**
     * 冒泡排序算法的改进
     * 针对这个数组
     * 第一次循环后: 4 2 3 5 8  flag=flase;
     * 第二次循环后: 2 3 4 5 8  flag=false;
     * 第三次循环后: 2 3 4 5 6  flag=true; 跳出循环,返回数组
     * @author jgp QQ:1072218420
     *
     */
    public class BubbleSort2{
        public static void main(String[] args) {
            int[] arr = new int[]{5,4,2,3,8};
            System.out.print("排序前:");
            for(int num:arr)
                System.out.print(num+" ");
            System.out.println();
            //进行排序
            int[] bubble_arr = sort(arr);
            System.out.print("排序后:");
            for(int num:bubble_arr)
                System.out.print(num+" ");
        }
        //冒泡排序算法
        private static int[] sort(int[] arr) {
            boolean flag =true;
            while(flag){
                flag = false;
                for(int j=1;j<arr.length;j++){
                    if(arr[j-1]>arr[j]){
                        int temp = arr[j-1];
                        arr[j-1] = arr[j];
                        arr[j] = temp;
                        flag=true;
                    }
                }
            }
            return arr;
        }       
    }

      再做进一步的优化。如果有100个数的数组,仅前面10个无序,后面90个都已排好序且都大于前面10个数字,那么在第一轮遍历后,最后发生交换的位置必定小于10,且这个位置之后的数据必定已经有序了,记录下这位置,第二次只要从数组头部遍历到这个位置就可以了 

    package com.tcxpz.bubble;
    /**
     * 冒泡排序算法的改进
     * @author jgp QQ:1072218420
     *
     */
    public class BubbleSort3{
        public static void main(String[] args) {
            int[] arr = new int[]{5,4,2,3,8,9,10,11,12,13,14,15,16,17,18};
            System.out.print("排序前:");
            for(int num:arr)
                System.out.print(num+" ");
            System.out.println();
            //进行排序
            int[] bubble_arr = sort(arr);
            System.out.print("排序后:");
            for(int num:bubble_arr)
                System.out.print(num+" ");
        }
        //冒泡排序算法
        private static int[] sort(int[] arr) {
            int flag= arr.length;
            while(flag>0){
                int k = flag;
                flag = 0;
                for (int j=1;j<k;j++){
                    if(arr[j-1]>arr[j]){
                        int temp = arr[j-1];    
                        arr[j-1] = arr[j];
                        arr[j] = temp;
                        flag = j;        //记住最后交换的位置
                    }
                }
            }
            return arr;
        }       
    }
  • 相关阅读:
    【题解】Triangles 3000 [CF528E]
    【题解】Alyona and Triangles [CF682E]
    【题解】Siano [PA2015] [Bzoj4293] / Chika 的烦恼
    【题解】The Last Hole! [CF274C]
    基于usb4java实现的java下的usb通信
    Android中解析JSON形式的数据
    Morris.js-利用JavaScript生成时序图
    android读写SD卡封装的类
    LitePal——安卓数据库library
    关于Linux Mint下的pluma软件打开txt文本文件有时候乱码的解决办法
  • 原文地址:https://www.cnblogs.com/tcxpz/p/10584761.html
Copyright © 2020-2023  润新知