zoukankan      html  css  js  c++  java
  • 冒泡排序

    在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;
        }       
    }
  • 相关阅读:
    Codeforces 893E Counting Arrays:dp + 线性筛 + 分解质因数 + 组合数结论
    Codeforces 938E Max History:排列 + 逆元【考虑单个元素的贡献】
    Codeforces 859E Desk Disorder:并查集【两个属性二选一】
    Codeforces 869C The Intriguing Obsession:组合数 or dp
    Codeforces 888D Almost Identity Permutations:错排公式
    Codeforces 870E Points, Lines and Ready-made Titles:并查集【两个属性二选一】
    Codeforces 895C Square Subsets:状压dp【组合数结论】
    leetcode
    hdu6578 2019湖南省赛D题Modulo Nine 经典dp
    Codechef March Cook-Off 2018. Maximum Tree Path
  • 原文地址:https://www.cnblogs.com/tcxpz/p/10584761.html
Copyright © 2011-2022 走看看