簡單選擇排序是一種儘量減少交換的一種排序方法。
一、在之前介紹的冒泡排序算法中,它的思想就是不斷進行交換不斷進行交換,而簡單選擇排序就是找準一個最小值之後在進行交換。舉個生活中簡單的例子,很多人喜歡炒股,有一些人喜歡快買快賣從中快速賺取差額,但有一些喜歡看準時機等待時機再進行買入跟買出,這跟冒泡排序跟簡單選擇排序的思路很像。
二、實現的原理
每一次進行比較,不進行交換而記錄最小值下標。就交換一次就是將最小值交換過來。
通過i次循環找到每次循環中的最小值的下標,將i位置的值跟最小值進行替換。如i=1時,min=1,依次跟j進行比較,如果min對應的值大於j對應的值,則min跟j進行交換,依次循環比較下去,直到集合末尾。判斷i跟min是否一致,一致的話代表min還是i的位置所以不需要替換,但是如果不一致,i跟min對應位置的值交換,這樣的話i位置對應的值就是最小值。接下來i++,就可以以此類推的進行尋找最小值。
三、代碼實現(PHP版本)
<?php
function EasySelect(&$array)
{
$length = count($array) - 1;
for ($i = 0; $i <= $length; $i++) {
$min = $i;
for ($j = $i + 1; $j <= $length; $j++) {
if ($array[$min] > $array[$j]) {
$min = $j;
}
}
if ($i != $min){
swap($array,$i,$min);
}
}
}
其他的swap就是簡單的交換函數我就不寫了。
四、時間複雜度分析(穩定排序)
最好的情況:基本全部有序,不需要進行0次交換。進行比較的次數爲1+2+3+4+...n-1=n*(n-1)/2次;
最壞的情況:全部無需,需要n-1次交換,進行比較的次數也跟最好的情況一樣;
排序的時間總和等於交換時間+比較時間,則時間複雜度爲O(n²);