排序算法之選擇排序 |Java 刷題打卡

本文正在參加「Java主題月 - Java 刷題打卡」,詳情查看 活動連接java

算法原理

在無序序列中查找最小(大)元素,從頭至尾掃描序列,查找最小的元素,和第一個元素交換位置,再從剩餘未排序元素中查找最小(大)元素,而後存放到已排序序列的末尾,繼續這種選擇和交換方式,直到全部元素都排序完成。算法

算法分析

原始序列:31, 6, 11, 8, 49, 16, 18, 15, 23, 9, 56, 2, 28, 30, 36數組

  1. 進行選擇排序過程可分爲有序和無序兩個部分,起始都是無序序列

結果:31, 6, 11, 8, 49, 16, 18, 15, 23, 9, 56, 2, 28, 30, 36markdown

2.從無序序列中查找最小的元素爲2,將2跟無序序列第一個元素交換,此時產生一個含有一個元素的有序序列,而無序序列元素個數減一app

結果:有序:{2} ,無序:{6, 11, 8, 49, 16, 18, 15, 23, 9, 56, 31, 28, 30, 36}post

3.從無序序列中查找最小的元素爲6,將6跟無序序列第一個元素交換,此時有序序列元素有兩個,而無序序列元素個數減一ui

結果:有序:{2,6},無序:{11, 8, 49, 16, 18, 15, 23, 9, 56, 31, 28, 30, 36}url

4.從無序序列中查找最小的元素爲8,將8跟無序序列第一個元素交換,此時有序序列元素有三個,而無序序列元素個數減一spa

結果:有序:{2,6,8},無序:{11, 49, 16, 18, 15, 23, 9, 56, 31, 28, 30, 36}3d

...

從無序序列中查找最小的元素爲31,將31跟無序序列第一個元素交換,此時有序序列元素有12個,而無序序列元素個數減一

結果:有序:{2, 6, 8, 9, 11, 15, 16, 18, 23, 28, 30, 31},無序:{49, 56, 36}

從無序序列中查找最小的元素爲36,將36跟無序序列第一個元素交換,此時有序序列元素有13個,而無序序列元素個數減一

結果:有序:{2, 6, 8, 9, 11, 15, 16, 18, 23, 28, 30, 31, 36},無序:{56, 49}

從無序序列中查找最小的元素爲49,將49跟無序序列第一個元素交換,此時有序序列元素有14個,而無序序列元素個數減一

結果:有序:{2, 6, 8, 9, 11, 15, 16, 18, 23, 28, 30, 31, 36, 49},無序:{56}

最後通過選擇排序後結果以下: 有序:{2, 6, 8, 9, 11, 15, 16, 18, 23, 28, 30, 31, 36, 49, 56}

思路

  • 選擇初始位置的值和其後的值一一比較,找到最小值,記錄最小值的下標
  • 找到最小值後,無序序列第i個位置的值和最小值的位置交換
  • 遍歷到最後一個元素爲止,結束排序

算法代碼

/** * @Description: 選擇排序算法 * @Author Gxin * @Date 2021/5/26 **/
public class SelectionSort {

    public static void selectionSort(int[] arr) {
        if (arr.length < 2 || arr == null) {
            return;
        }
        for (int i = 0; i < arr.length - 1; i++) {
            int minIndex = i;
            for (int j = i + 1; j < arr.length; j++) {
                minIndex = arr[j] < arr[minIndex] ? j : minIndex;
            }
            System.out.println("第" + (i + 1) + "輪結束序列爲:" + Arrays.toString(arr) + " ,最小值爲" + arr[minIndex] + ",最小值下標爲" + minIndex);
            swap(arr, i, minIndex);
        }
        System.out.println("結果:" + Arrays.toString(arr));
    }

    private static void swap(int[] arr, int i, int minIndex) {
        int temp = arr[i];
        arr[i] = arr[minIndex];
        arr[minIndex] = temp;
    }

    public static void main(String[] args) {
        int[] arr = {31, 6, 11, 8, 49, 16, 18, 15, 23, 9, 56, 2, 28, 30, 36};
        selectionSort(arr);
    }
}
複製代碼

結果

image.png

結果和算法分析過程是同樣,通過14輪比較後數組成爲有序數組。

總結

選擇排序時間複雜度:O(N^2),使用選擇排序對數據規模越小越好,好處是一次比較最須要換一次位置,缺點是效率慢,不穩定(好比11,8,11,6,10,第一遍選擇第一個最小元素6會和11交換,那原序列中2個11的相對位置先後順序被破壞了)

相關文章
相關標籤/搜索