• 排序算法---冒泡排序


    基于交换的排序、稳定的排序

    第一趟:对所有n个元素,从第一个元素开始,比较相邻的两个元素,如果逆序,调换;在第一轮比较完之后,最大(小)的元素就会在最后一个位置

    第二趟:对前n-1个元素,从第一个元素开始,比较相邻的两个元素,如果逆序,调换,在第二轮比较完之后,第二大(小)的元素就会在倒数第二位置

    ……

    一共比较n-1趟

        //冒泡排序,从小到大
        public static void bubbleSort(int[] array){
            int length = array.length;
            int temp= 0;
            for(int i=0;i<length-1;i++){//第几趟,一共n-1趟
                for(int j=0;j<length-1-i;j++){//每一趟对前n-i个数进行两两比较
                    if(array[j] > array[j+1]){//如果逆序,交换;否则,什么也不做
                        /*temp = array[j];
                        array[j] = array[j+1];
                        array[j+1] = temp;*/
                        array[j] = array[j]^array[j+1];
                        array[j+1] = array[j]^array[j+1];
                        array[j] = array[j]^array[j+1];
                    }
                }
                System.out.print(""+i+"趟:");
                listArray(array);
            }
        }

    原始数据:49 38 65 97 76 13 27 49
    第1趟:38 49 65 76 13 27 49 97
    第2趟:38 49 65 13 27 49 76 97
    第3趟:38 49 13 27 49 65 76 97
    第4趟:38 13 27 49 49 65 76 97
    第5趟:13 27 38 49 49 65 76 97
    第6趟:13 27 38 49 49 65 76 97
    第7趟:13 27 38 49 49 65 76 97

    改进:

    如果某一趟没有交换操作,证明该趟数据已经从小到大排好序了,不用再进行之后的操作

        //冒泡排序,从小到大
        public static void bubbleSort(int[] array){
            int length = array.length;
            int temp= 0;
            
            for(int i=0;i<length-1;i++){//第几趟,一共n-1趟
                boolean flag = false;
                for(int j=0;j<length-1-i;j++){//每一趟对前n-i个数进行两两比较
                    if(array[j] > array[j+1]){//如果逆序,交换;否则,什么也不做
                        /*temp = array[j];
                        array[j] = array[j+1];
                        array[j+1] = temp;*/
                        array[j] = array[j]^array[j+1];
                        array[j+1] = array[j]^array[j+1];
                        array[j] = array[j]^array[j+1];
                        flag = true;
                    }
                }
                System.out.print(""+(i+1)+"趟:");
                listArray(array);
                //每趟排序完之后,都看看该趟是否有交换操作,如果没有交换操作,证明该趟排序完之后,已经排好序了
                if(flag == false){
                    break;
                }
                
            }
        }

    原始数据:49 38 65 97 76 13 27 49
    第1趟:38 49 65 76 13 27 49 97
    第2趟:38 49 65 13 27 49 76 97
    第3趟:38 49 13 27 49 65 76 97
    第4趟:38 13 27 49 49 65 76 97
    第5趟:13 27 38 49 49 65 76 97
    第6趟:13 27 38 49 49 65 76 97

    改进前

    平均、最好、最差时间复杂度都是 O(n^2)

    改进后

    平均、最差O(n^2)   最好O(n)(本来就有序的情况下)

     

  • 相关阅读:
    如何搭建企业级中台系统
    Linux上安装git
    Jenkins的CI持续集成
    docker安装jenkins
    在线思维导图网站
    K8s容器编排
    MySQL存储引擎
    tomcat8 进入不了Manager App 界面 403 Access Denied
    IdeaVim-常用操作
    Node.js 安装及环境配置之 Windows 篇
  • 原文地址:https://www.cnblogs.com/duanjiapingjy/p/9552412.html
Copyright © 2020-2023  润新知