1. 程式人生 > >修煉內功---資料結構與演算法10---選擇排序

修煉內功---資料結構與演算法10---選擇排序

選擇排序演算法的實現思路有點類似插入排序

也分已排序區間和未排序區間

但是選擇排序每次會從未排序區間中找到最小的元素,將其放到已排序區間的末尾

<?php
    
    /**
     * 選擇排序演算法實現
     */
    function selection_sort($nums)
    {
        if (count($nums) <= 1) {
            return $nums;
        }
    
        for ($i = 0; $i < count($nums); $i++) {
            $min= $i;
            for ($j = $i + 1; $j < count($nums); $j++) {
                if ($nums[$j] < $nums[$min]) {
                    $min = $j;
                }
            }
            if ($min != $i) {
                $temp = $nums[$i];
                $nums[$i] = $nums[$min];
                $nums[$min] = $temp;
            }
        }
    
        return $nums;
    }
    
    $nums = [4, 5, 6, 3, 2, 1];
    $nums = selection_sort($nums);
    print_r($nums);

很顯然,選擇排序的時間複雜度也是 O(n^2)

由於不涉及額外的儲存空間,所以是原地排序

由於涉及非相鄰元素的位置交換,所以是不穩定的排序演算法

 

綜合比較前面介紹的三個排序演算法,時間複雜度都是一樣的,也都是原地排序,但是選擇排序是不穩定的排序演算法,此外,插入排序和氣泡排序相比較,我們在將插入排序的時候講到,插入排序只需要一條語句,而氣泡排序需要三條,在同等條件下,或者資料量很大的情況下,插入排序效能是要由於氣泡排序的,所以綜合比較下來,三者的優先順序是插入排序 > 氣泡排序 >> 選擇排序。但是三者的時間複雜度都是 O(n^2),資料量很大的情況下效能表現並不是很理想,那有沒有效能更好的排序演算法呢?當然有,我們明天來揭曉。