“冒泡排序”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
第8行: 第8行:
 
# 如此反复,直到排序完毕。
 
# 如此反复,直到排序完毕。
  
 +
比如:
 +
 +
排序前的原始数组
 +
{| class="wikitable"
 +
!8
 +
!6
 +
!12
 +
!7
 +
!2
 +
!5
 +
!4
 +
!1
 +
!9
 +
|}
  
  

2022年11月8日 (二) 06:35的版本

https://www.bilibili.com/video/BV1tW4y1i7Mo

算法描述

  1. 首先从未排序数组的首位开始,和后面相邻的数字进行比较,如果前面一个比后面一个大,那么则进行交换。
  2. 接下来再将第二个位置的数字和后面相邻的数字进行比较,如果大,那么则进行交换,直到将最大的数字交换到数组的尾部
  3. 然后再从排序的数组的首位开始,重复前面两步,将最大的数组交换到未排序数组的尾部(交换到尾部的数字是已经排好序的)。
  4. 如此反复,直到排序完毕。

比如:

排序前的原始数组

8 6 12 7 2 5 4 1 9


算法实现

分解1:将第一个数字和后面相邻的数字进行比较,如果大则进行交换

public class BubbleSort {

    public static void bubbleSort(int[] arr) {

        if (arr == null || arr.length < 2) {
            return;
        }

        for (int e = arr.length - 1; e > 0; e--) {// 0 ~ e

            for (int i = 0; i < e; i++) {

                if (arr[i] > arr[i + 1]) {

                    swap(arr, i, i + 1);
                }

            }//end for

        }//end for

    }//end bubbleSort

    /**
     * 交换 arr 的 i 和 j 位置上的值
     * 相较于:
     * int tmp = arr[i];
     * arr[i] = arr[j];
     * arr[j] = tmp;
     * 的写法,节省了一个额外的空间
     * @param arr
     * @param i
     * @param j
     */
    public static void swap(int[] arr, int i, int j) {
        arr[i] = arr[i] ^ arr[j];
        arr[j] = arr[i] ^ arr[j];
        arr[i] = arr[i] ^ arr[j];
    }

    public static void main(String[] args) {
        int[] arr = new int[]{6, 8, 4, 3, 9, 7};
        SelectionSort.selectionSort(arr);
        System.out.print(arr[0]);
        for(int i = 1; i < arr.length; i++){
            System.out.print(", " + arr[i]);
        }
    }
}