PHP實(shí)現(xiàn)選擇排序

上回說到冒泡排序,這次說說選擇排序。
選擇排序(Selection sort)是一種簡單直觀的排序算法。它的工作原理如下。首先在未排序序列中找到最?。ù螅┰?,存放到排序序列的起始位置,然后,再從剩余未排序元素中繼續(xù)尋找最小(大)元素,然后放到已排序序列的末尾。以此類推,直到所有元素均排序完畢。

基本思路

選擇排序的主要優(yōu)點(diǎn)與數(shù)據(jù)移動有關(guān)。如果某個元素位于正確的最終位置上,則它不會被移動。選擇排序每次交換一對元素,它們當(dāng)中至少有一個將被移到其最終位置上,因此對n個元素的表進(jìn)行排序總共進(jìn)行至多n-1次交換。在所有的完全依靠交換去移動元素的排序方法中,選擇排序?qū)儆诜浅:玫囊环N。

來一張示例動畫圖看一下

選擇排序的示例動畫。
選擇排序的示例動畫。

紅色表示當(dāng)前最小值,黃色表示已排序序列,藍(lán)色表示當(dāng)前位置。

復(fù)雜度分析

選擇排序的交換操作介于 0 和 (n - 1) 次之間。選擇排序的比較操作為 n (n - 1) / 2 次之間。選擇排序的賦值操作介于 0 和 3 (n - 1) 次之間。
比較次數(shù)O(n^2),比較次數(shù)與關(guān)鍵字的初始狀態(tài)無關(guān),總的比較次數(shù)N=(n-1)+(n-2)+...+1=n*(n-1)/2。交換次數(shù)O(n),最好情況是,已經(jīng)有序,交換0次;最壞情況交換n-1次,逆序交換n/2次。交換次數(shù)比冒泡排序少多了,由于交換所需CPU時間比比較所需的CPU時間多,n值較小時,選擇排序比冒泡排序快。

選擇排序點(diǎn)圖
選擇排序點(diǎn)圖

<pre>
時間復(fù)雜度 О(n2)
最優(yōu)時間復(fù)雜度 О(n2)
平均時間復(fù)雜度 О(n2)
空間復(fù)雜度 О(n) total, O(1) auxiliary
</pre>

百聞不如一run (php實(shí)現(xiàn)選擇排序)

<?php
/**
 * User: wujunze
 * Email: itwujunze@163.com
 * Blog: https://wujunze.com
 * Date: 2016/11/5
 *
 */
function selectSort($arr) {
//雙重循環(huán)完成,外層控制輪數(shù),內(nèi)層控制比較次數(shù)
 $len=count($arr);
    for($i=0; $i<$len-1; $i++) {
        //先假設(shè)最小的值的位置
        $p = $i;
        
        for($j=$i+1; $j<$len; $j++) {
            //$arr[$p] 是當(dāng)前已知的最小值
            if($arr[$p] > $arr[$j]) {
            //比較,發(fā)現(xiàn)更小的,記錄下最小值的位置;并且在下次比較時采用已知的最小值進(jìn)行比較。
                $p = $j;
            }
        }
        //已經(jīng)確定了當(dāng)前的最小值的位置,保存到$p中。如果發(fā)現(xiàn)最小值的位置與當(dāng)前假設(shè)的位置$i不同,則位置互換即可。
        if($p != $i) {
            $tmp = $arr[$p];
            $arr[$p] = $arr[$i];
            $arr[$i] = $tmp;
        }
    }
    //返回最終結(jié)果
    return $arr;
}

var_dump(selectSort(array(4,66,3,23,91,36,88,6)));

運(yùn)行結(jié)果

代碼運(yùn)行結(jié)果
代碼運(yùn)行結(jié)果

參考
維基百科
Google搜索
等技術(shù)文檔

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

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

  • 概述 排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    蟻前閱讀 5,297評論 0 52
  • 一、 單項(xiàng)選擇題(共71題) 對n個元素的序列進(jìn)行冒泡排序時,最少的比較次數(shù)是( )。A. n ...
    貝影閱讀 9,416評論 0 10
  • 概述:排序有內(nèi)部排序和外部排序,內(nèi)部排序是數(shù)據(jù)記錄在內(nèi)存中進(jìn)行排序,而外部排序是因排序的數(shù)據(jù)很大,一次不能容納全部...
    每天刷兩次牙閱讀 3,819評論 0 15
  • 1.插入排序—直接插入排序(Straight Insertion Sort) 基本思想: 將一個記錄插入到已排序好...
    依依玖玥閱讀 1,347評論 0 2
  • 排序的基本概念 在計算機(jī)程序開發(fā)過程中,經(jīng)常需要一組數(shù)據(jù)元素(或記錄)按某個關(guān)鍵字進(jìn)行排序,排序完成的序列可用于快...
    Jack921閱讀 1,565評論 1 4

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