13-冒泡排序

Posted liujiaqi1101

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了13-冒泡排序相关的知识,希望对你有一定的参考价值。

1. 基本介绍

冒泡排序(Bubble Sorting)的基本思想是:通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底下的气泡一样逐渐向上冒

2. 举例说明

技术图片

3. 代码实现

public class BubbleSort {
    public static void main(String[] args) {
        int arr[] = {1, 2, 3, 4, 5};
        finalVersion(arr);
        System.out.println("------------------------");
        int arr2[] = new int[80000];
        for(int i = 0; i < 80000; i++)
            arr2[i] = (int) (Math.random() * 800000);
        
        Date date1 = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String str1 = sdf.format(date1);
        System.out.println(str1);
        bubbleSort(arr2); // 测试:8w个数据
        Date date2 = new Date();
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String str2 = sdf2.format(date2);
        System.out.println(str2);
    }
    
    public static void finalVersion(int[] arr) {
        int temp;
        boolean flag = false; // 标识 是否进行过交换
        for(int i = 0; i < arr.length-1; i++) {
            for(int j = 0; j < arr.length-1 -i; j++)
                if(arr[j] > arr[j+1]) {
                    flag = true;
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
            System.out.printf("第 %d 趟排序之后: %s
", i+1, Arrays.toString(arr));
            
            if(flag) // 重置flag, 以便下次判断
                flag = false;
            else // 在一趟排序中, 一次交换都没有发生过, 说明已经有序了
                break;
        }
    }

    public static void bubbleSort(int[] arr) {
        int temp;
        // 每经过1次大循环, 即可确定1个元素的最终位置
        for(int i = 0; i < arr.length-1; i++)
            for(int j = 0; j < arr.length-1 -i; j++)
                if(arr[j] > arr[j+1]) {
                    temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                }
    }
    
    public static void detail(int[] arr) {
        int temp;
        // [第1趟] 5个元素, 相邻元素两两进行比较, 一共是比较[0, 3]→4回, 确定了最大元素
        for(int j = 0; j < arr.length-1 -0; j++)
            if(arr[j] > arr[j+1]) {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        System.out.println("第1趟之后:" + Arrays.toString(arr));
        
        // [第2趟] ∵最大元素的位置已经确定了 ∴只需比较前4个元素, 也就是比较[0, 2]→3回
        for(int j = 0; j < arr.length-1 -1; j++) 
            if(arr[j] > arr[j+1]) {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        System.out.println("第2趟之后:" + Arrays.toString(arr));
        
        // [第3趟] ∵最大和次大元素的位置都确定了 ∴只需比较前3个元素, 也就是比较[0, 1]→2回
        for(int j = 0; j < arr.length-1 -2; j++) 
            if(arr[j] > arr[j+1]) {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        System.out.println("第3趟之后:" + Arrays.toString(arr));
        
        // [第4趟] ∵后3个元素的位置都确定了 ∴只需比较前2个元素, 也就是比较[0, 0]→1回
        for(int j = 0; j < arr.length-1 -3; j++) 
            if(arr[j] > arr[j+1]) {
                temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp;
            }
        System.out.println("第4趟之后:" + Arrays.toString(arr));
        
        // n个元素, 只需确定后n-1个元素的最终位置即可
    }
}

以上是关于13-冒泡排序的主要内容,如果未能解决你的问题,请参考以下文章

13-02 Java 数组高级算法,Arrays类

数组冒泡排序选择排序二分查找法

java冒泡排序和快速排序代码

冒泡排序作业

3月13日 冒泡排序

排序概述,冒泡排序_听韩顺平课笔记