選擇排序算法,只需這篇文章就夠了

一、說在前面

一直想寫一些簡單易懂的文章,因爲平時看的很多的書籍或者文章都是看着很難受的感覺,當然,這並不是說書籍寫的不好,只是說對於一些沒有太多基礎或者基礎不是很好的來說,相對來說還是比較難以理解的。

這個系列主要是寫一些簡單易懂的數據結構與算法的文章,同時也是幫助自己再理解理解這方面的知識。

作爲數據結構與算法的開篇,還是以排序算法作爲第一部分的內容,需要注意的是,這一系列的文章並不是涉及到很多理論性質的知識,因爲前面說了,主要還是希望文章是簡單易懂的,希望能達到讀故事的感覺。如果需要去學習理論性質的知識,可以去查看相關的數據結構與算法的書籍。

二、選擇排序算法

今天早上,老師又叫我們去操場上做早操,做早操之前呢,今天也需要排隊,到操場的同學有5個人,今天的排序方法還是按照身高由低到高排列

圖片.png

但是,今天老師說換一種方法排隊,我來給你們排隊,昨天你們排隊太慢了。

於是,老師說:第一個同學站在原地不要動。

圖片.png

然後,我從後面4個同學當中挑一個最矮的同學,這個同學站在第一個同學後面,你們兩個站在原地不要動。

圖片.png

圖片.png

之後,老師再從後面3個同學裏面挑一個最矮的同學,然後讓他站在前面兩個排好的同學後面,這樣這三個同學就排好了,你們站着不要動。

圖片.png

圖片.png

老師又從最後兩個同學中挑一個最矮的同學,讓他站在前面三個已經排好的隊伍後面,這樣,這四個同學就排好隊列,這四個同學站着不要動。

圖片.png

四個同學排好了,只有最後一個同學了,然後,這個同學自己站到前面四個已經排好隊的隊伍的最後,這樣5個同學的位置就排好了。

圖片.png

圖片.png

老師看到排好了隊,非常開心,對同學們說:“我排隊是不是比你們自己排隊快啊!”

然後,這位程序員老師說,哪位同學懂了剛剛我給你們排隊的思想,能不能敘述一下,這時候,小明說:我會!,於是,小明說了一下思想

初始時在隊伍中找到最小(大)元素,放到隊伍的起始位置作爲已排好隊伍;然後,再從剩餘未排序隊伍中繼續尋找最小(大)元素,放到已排序隊伍的末尾。以此類推,直到所有元素均排序完畢。

老師說,隊列都給你們排好了,小明同學也又很好的闡述了思想,你們把代碼實現以下吧(哈哈哈!)。

於是,小海同學就去按照老師的排隊方法,實現了選擇排序算法

public static void selectionSort(int[] arr) {
        if (arr == null || arr.length < 2) {
            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;
            }

            swap(arr, i, minIndex);// 放到已排序序列的末尾,該操作很有可能把穩定性打亂,所以選擇排序是不穩定的排序算法
        }
    }

    public static void swap(int[] arr, int i, int j) {
        int tmp = arr[i];
        arr[i] = arr[j];
        arr[j] = tmp;
    }
性能分析

最差時間複雜度:O(n^2) 最優時間複雜度:O(n^2) 平均時間複雜度: O(n^2) 所需輔助空間:O(1) 穩定性:不穩定

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章