2021 后端筆試準(zhǔn)備 18 選擇排序

選擇排序是一個非常經(jīng)典的排序算法在之前也詳細(xì)的講過了,今天單獨提出來再講一次:

插入排序算法基本思路

遍歷輸入的整數(shù)數(shù)組中的未排序的元素,找到其中最小的值,和已經(jīng)排序被排序的元素右邊的一個元素進(jìn)行交換進(jìn)行交換。

舉個例子:

例如我們現(xiàn)在有輸入數(shù)組[4, 3, 2, 1]我們需要把他排序成[1, 2, 3, 4],因此我們現(xiàn)在要找到輸入數(shù)組中最小的元素,也就是1,然后將它和4交換,然后找到剩下數(shù)組中最小的元素,也就是2,然后和3交換,以此類推。最后我們就會得到[1, 2, 3, 4]。

知道了基本思路,讓我們來看看他的時間復(fù)雜度和空間復(fù)雜度。

時間復(fù)雜度:

在排序第一個數(shù)的時候我們需要在數(shù)組中 0 ~ n - 1的范圍上尋找到最小值,然后和0交換。

在排序第二個數(shù)的時候我們需要在數(shù)組中 1 ~ n - 1的范圍上尋找到最小值,然后和1交換。

....

在排序第二個數(shù)的時候我們需要在數(shù)組中 n - 2 ~ n - 1的范圍上尋找到最小值,然后和n - 1交換。

因此我們不難發(fā)現(xiàn)總的時間復(fù)雜度是 (n-1) + (n-2) + (n -3) ... [n-(n-2)],所以很明顯這個是一個等差數(shù)列的加和,根據(jù)等差數(shù)列求和公式S = An^2 + Bn,我們可以得出他的時間復(fù)雜度是O(n^2+n),因此我們?nèi)∽罡唔椌褪?img class="math-inline" src="https://math.jianshu.com/math?formula=O(n%5E2)" alt="O(n^2)" mathimg="1">。

空間復(fù)雜度:

空間復(fù)雜度是O(1),我們只需要兩個變量來儲存交換雙方的下標(biāo),所以我們只需要存儲額外的兩個下標(biāo)的值就行了,所以空間復(fù)雜度是O(1)。

接下來我們來看代碼:

public class Code01_SelectionSort {

    public static void selection(int[] arr){
        // 輸入整數(shù)類型的列表
        if(arr == null || arr.length < 2){
            // 如果輸入的數(shù)組為空或者小于 2就直接返回,為空和為1都不用排序是吧?
            return;
        }

        for(int i = 0; i < arr.length; i++) {
            //遍歷數(shù)組中的每一個元素,申請一個變量記錄最小的元素
            int minIdx = i;
            for(int j = i + 1; j < arr.length; j++){
                // 找到最小元素,交換
                minIdx = arr[i] < arr[minIdx] ? j : minIdx;
            }
            swap(arr, minIdx, i);
        }
    }

    public static void swap(int[] arr, int idxOne, int idxTwo){
        // 交換兩個元素
        int temp = arr[idxOne];
        arr[idxOne] = arr[idxTwo];
        arr[idxTwo] = temp;
    }
}

Reference: https://italk.mashibing.com/course/detail/cour_00004003

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容