算法 | 选择排序、冒泡排序

129 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第25天,点击查看活动详情

选择排序

排序规则,给出一个无序数组,按从小到大的顺序进行排列。

选择排序,简单的讲就是在这一组数据中,依次选择出最小的元素进行排列。

排序原理

假如数组长度为N,第一次从 0 ~ N - 1 位置寻找一个最小值,然后与0位置的数进行交换;第二次从1 ~ N - 1位置寻找一个最小值,然后与1位置的数进行交换;依此类推,直到把整个数组都进行了排序。

给定一组数据:

3, 5, 2, 7, 13, 8, 1, 9, 12

第1次,从第1位开始,找出这组数据中的最小值与第1个数进行交换,即数字1与数字3进行交换,交换完的数据为:1, 5, 2, 7, 13, 8, 3, 9, 12

第2次,从第2位开始,找出剩余数据中的最小值与第2个数进行交换,即数字2与数字5进行交换,交换完的数据为:1, 2, 5, 7, 13, 8, 3, 9, 12

第3次,从第3位开始,找出剩余数据中的最小值与第3个数进行交换,即数字3与数字5进行交换,交换完的数据为:1, 2, 3, 7, 13, 8, 5, 9, 12

......

第8次,从第8位开始,找出剩余数据中的最小值与第8个数进行交换,即数字3与数字5进行交换,交换完的数据为:1, 2, 3, 5, 7, 8, 9, 12, 13

第9次,从第9位开始,只剩下1位数字,不用交换。

代码实现

public class Code02_SelectionSort {
    public static void main(String[] args) {
        int[] arr = {3, 5, 2, 7, 13, 8, 1, 9, 12};
        print(arr);
        selectionSort(arr);
        print(arr);
    }
    public static void print(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
    public static void selectionSort(int[] arr) {
        if (arr == null || arr.length == 1) {
            return;
        }
        int N = arr.length;
        for (int i = 0; i < N; i++) {
            int minIdx = i;
            for (int j = i + 1; j < N; j++) {
                minIdx = arr[j] < arr[minIdx] ? j : minIdx;
            }
            swap(arr, minIdx, i);
        }
    }
    public static void swap(int[] arr, int i, int j) {
        int temp = arr[i];
        arr[i] = arr[j];
        arr[j] = temp;
    }
}

运行输出结果为:

3 5 2 7 13 8 1 9 12 
1 2 3 5 7 8 9 12 13 

冒泡排序

冒泡排序,就是从给定的数组里,从开头每两个数进行比较,谁大谁往后放,对数组进行重复扫描,直到所有的数据都排列好。

排序原理

  1. 从前往后依次比较相邻的元素,若后面的元素比前面的小,就交换这2个元素,否则保持不变。
  2. 对每一对相邻元素做同样的工作,进行一轮比较交换下来,最后的元素就会是最大的数了。
  3. 针对所有的元素重复以上的步骤,直到排序完成。

给定一组数据:

3, 5, 2, 7, 13, 8, 1, 9, 12

第1轮,从第1位开始,首先3和5比较,保持不变;5和2比较,进行交换;5和7比较,保持不变;7和13比较,保持不变;13和8比较,进行交换;13和1比较,进行交换;13和9比较,进行交换;13和12比较,进行交换。第1轮结束,结果为:3, 2, 5, 7, 8, 1, 9, 12, 13

第2轮,从第1位开始,首先3和2比较,进行交换;3和5比较,保持不变;5和7比较,保持不变;7和8比较,保持不变;8和1比较,进行交换;8和9比较,保持不变;9和12比较,保持不变。第2轮结束,结果为:2, 3, 5, 7, 1, 8, 9, 12, 13

以此类推,最终结果为1, 2, 3, 5, 7, 8, 9, 12, 13

代码实现

public class Code03_BubbleSort {
    public static void main(String[] args) {
        int[] arr = {3, 5, 2, 7, 13, 8, 1, 9, 12};
        print(arr);
        bubbleSort(arr);
        print(arr);
    }
    public static void bubbleSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            return;
        }
        for (int i = arr.length - 1; i > 0; i--) { 
            for (int j = 0; j < i; j++) {
                if (arr[j] > arr[j + 1]) {
                    swap(arr, j, j + 1);
                }
            }
        }
    }

    // 交换arr的i和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 print(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }
}

执行结果为:

3 5 2 7 13 8 1 9 12 
1 2 3 5 7 8 9 12 13