Java中数组的冒泡排序,冒泡排序优化

冒泡排序:

 思路:
        int[] arr={3,4,2,6,1};
      1.第一次排序,从索引[0]开始,依次两两比较。索引[0]与[1]比,[1]与[2]比,[2]与[3]比……
      
        if(arr[0]<arr[1]){
          元素的位置不变;   
        }
        
        if(arr[1]>arr[2]){
          //交换位置
          int temp=arr[1];
          arr[1]=arr[2];
          arr[2]=arr[temp];
        }
        
          如长度为n(5)的数组arr ,第一次排序,共比较n-1(4)次;排序后为{3,2,4,1,6},此时数组的最后
       一个元素为数组的最大值;
       
       2.第二次排序(假设共需排序i次,此时索引[i]=1):
           依次类推,此时元素的最大值已经确定,也就是数组的最后两个元素不用比较了。排序后的数组
       为{2,3,1,4,6},共比较了n-1-i(3)次
       
       ......

代码:


     public static void main(String[] args) {

        int[] arr={3,4,2,6,1};
        System.out.println("当前数组:"+ Arrays.toString(arr));

        for (int i = 0; i < arr.length-1; i++) { //最外层,共需排序n-1次
            for (int j = 0; j <arr.length-1-i; j++) {//内层,第i次排序需排序n-i-i次
                if(arr[j]>arr[j+1]) {
                    //交换位置
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                }
            }

        }
        System.out.println("排序后:"+ Arrays.toString(arr));
    }

冒泡排序优点:

  冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排 序都会找出一个较大值。
                 每一趟少比较一次,一定程度上减少了算法的量。
  时间复杂度为:O(n²) tip:这个我是直接记得,不整为什么了

冒泡排序法存在的不足及改进方法:

    第一,在排序过程中,执行完最后的排序后,虽然数据已全部排序完备,但程序无法判断是否完成排       
 序,为了解决这一不足,可设置一个标志位flag,将其初始值设置为非0,表示被排序的表是一个
 无序的表,每一次排序开始前设置flag值为0,在进行数据交换时,修改flag为非0。在新一轮排序
 开始时,检查此标志,若此标志为0,表示上一次没有做过交换数据,则结束排序;否则进行排序
 
 此段转自https://www.cnblogs.com/xiaoming0601/p/5866048.html 他那的冒泡优化有点小问题0.0

冒泡排序优化


        int[] arr={3,4,5,6,7};
        System.out.println("当前数组:"+ Arrays.toString(arr));

        boolean flag=false; //添加的代码,用flag标记,也可以添加一个计数器
        
        for (int i = 0; i < arr.length-1; i++) { //最外层,共需排序n-1次
            for (int j = 0; j <arr.length-1-i; j++) {//内层,第i次排序需排序n-i-1次
                if(arr[j]>arr[j+1]) {
                    //交换位置
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    flag=true;
                }
            }
            //添加的代码
            if(!flag){
                break;//如果数组没有生改变,flag则仍为为false,此时执行这段代码,跳出循环
            }

        }
        System.out.println("排序后:"+ Arrays.toString(arr));

-----------------------------------------------------我是分割线----------------------------------------------------------------

插入排序和选择排序也重新整一片吧

猜你喜欢

转载自blog.csdn.net/weixin_41229776/article/details/84031877