冒泡排序

一种简单的排序算法;重复的走访整个序列,一次比较相邻的两个元素,如果顺序不一致就将它们交换过来;走访序列的工作是重复进行的,直到没有再需要交换的元素,即表示这个序列已排序完成;这个算法的名字由来是因为越小(或越大)的元素会经由交换慢慢"浮"到序列的一端

   

假设有一个无序序列 L0L1L2Ln-1

  • 比较相邻两个元素 LiLi-1 ,按照一定的规则(降序或升序)比较,进行交换
  • 对每一对相邻元素做同样的比较交换,从开始的第一对 L0 ~ L1 到结尾最后的一对 Ln-2 ~ Ln-1 ,这样在最会的元素要么是最大的要么是最小的
  • 针对所有的元素重复以上的步骤,每进行一次循环后,必然会取出一个极值
  • 重复步骤 1~3,直到排序完成

      

import java.util.Arrays;

/**
 * 方案1
 * @date 2020/8/20 11:04
 */
public class TestSort {

    public static void main(String[] args) {
               // 待排序数组 
        int[] arr = {8, 2, 4, 12, 4, 10, 3, 11, 1};
        System.out.println(Arrays.toString(arr));
               // 排好序数组
        int[] sort = bubbleSort(arr);
        System.out.println(Arrays.toString(sort));
    }

       // 常规版本
    private static int[] bubbleSort(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;
    }
}
import java.util.Arrays;

/**
 * 方案2
 */
public class TestSort {

    public static void main(String[] args) {
        int[] arr = {8, 2, 4, 12, 4, 10, 3, 11, 1};
        System.out.println(Arrays.toString(arr));
        int[] sort = bubbleSort(arr);
        System.out.println(Arrays.toString(sort));
    }

       // 升级版本1
    private static int[] bubbleSort(int[] arr) {
        for (int i = 1; i < arr.length; i++) {
            // 标志是否有交换
            boolean flag = false;
            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;
                    flag = true;
                }
            }
            // 无交换表明序列已然有序
            if (!flag) {
                break;
            }
        }
        return arr;
    }
}

  

import java.util.Arrays;

/**
 * 方案3
 * @date 2020/8/20 11:04
 */
public class TestSort {

    public static void main(String[] args) {
        int[] arr = {8, 2, 4, 12, 4, 10, 3, 11, 1};
        System.out.println(Arrays.toString(arr));
        int[] sort = bubbleSort(arr);
        System.out.println(Arrays.toString(sort));
    }

       // 升级版本2
    private static int[] bubbleSort(int[] arr) {
        int len = arr.length - 1;
        // 记录最后一次交换的位置
        int tempPosition = 0;
        for (int i = 1; i < arr.length; i++) {
            // 标志是否有交换
            boolean flag = false;
            for (int j = 0; j < len; j++) {
                if (arr[j] > arr[j + 1]) {
                    int temp = arr[j];
                    arr[j] = arr[j + 1];
                    arr[j + 1] = temp;
                    // 发生交换,标志 true
                    flag = true;
                    // 记录交换的位置
                    tempPosition = j;
                }
            }
            // 把最后一次交换的位置给 len,来缩减内循环的次数
            len = tempPosition;
            // 无交换表明序列已然有序
            if (!flag) {
                break;
            }
        }
        return arr;
    }
}

   

   

原文地址:https://www.cnblogs.com/sebastian-tyd/p/13580203.html