0
点赞
收藏
分享

微信扫一扫

算法-基础-01-冒泡算法

343d85639154 2022-04-04 阅读 35
java算法

文章目录

1, 冒泡算法

a06_01_Bubble_basic

package im.bool.a06_sort_algrithm;

/**
 * #Author : ivanl001
 * #Date   : 2020/2/24 9:53 AM
 * #Desc   : 排序算法之冒泡推算过程:
 *          这个过程中有一个优化过程:如果经过一轮冒泡,顺序完全没有变动,那么后续就不需要进行了,因为这个时候顺序已经排好了
 **/
public class a06_01_Bubble_basic {
    public static void main(String[] args) {

        int[] nums = {3, 9, -1, -2, 10};

        int temp;

        System.out.println("第一次冒泡:");
        for (int i=0;i<nums.length-1;i++) {
            if (nums[i] > nums[i+1]) {
                temp = nums[i];
                nums[i] = nums[i + 1];
                nums[i+1] = temp;
            }
        }
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + ", ");
        }
        System.out.println();


        System.out.println("第二次冒泡:");
        for (int i=0;i<nums.length-1-1;i++) {
            if (nums[i] > nums[i+1]) {
                temp = nums[i];
                nums[i] = nums[i + 1];
                nums[i+1] = temp;
            }
        }
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + ", ");
        }
        System.out.println();


        System.out.println("第三次冒泡:");
        for (int i=0;i<nums.length-1-2;i++) {
            if (nums[i] > nums[i+1]) {
                temp = nums[i];
                nums[i] = nums[i + 1];
                nums[i+1] = temp;
            }
        }
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + ", ");
        }
        System.out.println();


        System.out.println("第四次冒泡");
        for (int i=0;i<nums.length-1-3;i++) {
            if (nums[i] > nums[i+1]) {
                temp = nums[i];
                nums[i] = nums[i + 1];
                nums[i+1] = temp;
            }
        }
        for (int i = 0; i < nums.length; i++) {
            System.out.print(nums[i] + ", ");
        }
        System.out.println();
    }
}

a06_02_Bubble

package im.bool.a06_sort_algrithm;

import jdk.internal.org.objectweb.asm.tree.FrameNode;

import java.util.Arrays;

/**
 * #Author : ivanl001
 * #Date   : 2020/2/24 5:58 PM
 * #Desc   : 冒泡排序算法:两次循环实现
 **/
public class a06_02_Bubble {

    public static void main(String[] args) {

        /*int[] nums = {9, -2, -1, 3, 10, 100, -3, 3, 4, 20};
        bubbleSort(nums);
        for (int j = 0; j < nums.length; j++) {
            System.out.print(nums[j] + ", ");
        }
        System.out.println();*/


        int[] nums = new int[80000];
        for (int i = 0; i < 80000; i++) {
            nums[i] = (int) (Math.random() * 80000);
        }

//        System.out.println(Arrays.toString(nums));

        long startTime = System.currentTimeMillis();
        bubbleSort(nums);
        long endTime = System.currentTimeMillis();
        //9s左右
        System.out.println(endTime-startTime);
    }


    public static void  bubbleSort(int[] nums) {
        int temp;
        boolean isOrdered = false;

        //因为冒泡排序算法是两层循环,所以冒泡排序算法的时间复杂度是O(n^2)
        for (int i = 0; i < nums.length-1; i++) {
            isOrdered = true;
//            System.out.println("第" + (i+1) + "次冒泡:");
            //-------------------冒泡算法的精华代码--------------------
            for (int j = 0; j < nums.length - 1 - i; j++) {
                if (nums[j] > nums[j + 1]) {
                    temp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = temp;
                    isOrdered = false;
                }
            }

            /*for (int j = 0; j < nums.length; j++) {
                System.out.print(nums[j] + ", ");
            }
            System.out.println();*/
            //这个地方是一个小优化。如果经过一轮,数据顺序完全没有变动
            if (isOrdered) {
                System.out.println("第" + (i+1) + "次循环");
                System.out.println("已经有序。。。");
                break;
            }
        }
    }
}

a06_03

  • 如果是向左冒泡,那么左边的边界需要依次变大
  • 如果是向右冒泡, 那么右边的边界需要依次变小
// 如果是向左冒泡,那么左边的边界需要依次变大
public static void bubbleSort(int[] arr) {
    for (int i = 0; i < arr.length; i++) {
        for (int j = arr.length-1; j > i; j--) {
            if (arr[j] < arr[j - 1]) {
                int temp = arr[j];
                arr[j] = arr[j - 1];
                arr[j - 1] = temp;
            }
        }
    }
}

// 如果是向右冒泡, 那么右边的边界需要依次变小
public static void bubbleSort_v1(int[] arr){
    for (int i = 0; i < arr.length; i++) {
    	// 注意:这里j < arr.length-i-1, 是减去i哈
        for (int j = 0; j < arr.length-i-1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j+1];
                arr[j + 1] = temp;
            }
        }
    }
}
举报

相关推荐

0 条评论