● 選擇排序也是內(nèi)部排序
● 排序思想:
第一次先隨便選擇一個(gè)數(shù),就是在要排序的數(shù)組中選擇一個(gè)元素和數(shù)組的其它元素比較。然后比較交換位置得到最小值或者最大值,然后再次在剩下的數(shù)組中,選擇一個(gè)數(shù)和數(shù)組剩下的元素比較,最后得到第二個(gè)最小或最大的元素。依次類推
● 示意圖:
選擇排序一共有數(shù)組大小 - 1 輪排序;每一輪排序又是一個(gè)循環(huán);先假定當(dāng)前的這個(gè)數(shù)組就是最小數(shù),然后和后面的元素依次比較,如果發(fā)現(xiàn)有比當(dāng)前數(shù)更小的數(shù),就重新確定最小數(shù),并得到下標(biāo),當(dāng)遍歷到數(shù)組的最后時(shí),就得到本輪最小數(shù)和下標(biāo),交換
1. 假設(shè)有一個(gè)待排序的數(shù)組 [3, 1, 15, 5, 20]
2. 隨機(jī)選擇一個(gè)元素,假設(shè)第一個(gè)就是最小的元素,拿 3 和數(shù)組剩下的元素比較,第一輪排序后得到最小元素 1
<?php$arr = [3, 1, 15, 5, 20];$count = count($arr);//假設(shè)最小的元素就是第一個(gè)元素$minIndex = 0;$min = $arr[0];for ($j = $minIndex + 1; $j < $count; $j++) { if ($min > $arr[$j]) { //假定的最小值大于后面的值,重置最小值 $min = $arr[$j]; $minIndex = $j; }}$arr[$minIndex] = $arr[0];$arr[0] = $min;
3. 再次選擇一個(gè)假定最小值,與后面的元素一次比較,得到第二個(gè)最小值
<?php$arr = [1, 3, 15, 5, 20];$count = count($arr);//假設(shè)最小的元素就是第二個(gè)元素$minIndex = 1;//假設(shè)的最小元素的下表$min = $arr[1];//假定最小元素的值for ($j = $minIndex + 1; $j < $count; $j++) { if ($min > $arr[$j]) { //假定的最小值大于后面的值,重置最小值 $min = $arr[$j]; $minIndex = $j; }}if ($minIndex != 1) { $arr[$minIndex] = $arr[1];//假定的最小元素不是最小元素,那么把后面的最小元素和假定的最小元素做交換 $arr[1] = $min;//元素下標(biāo)交換}
4. 以此類推,就可以使用雙重 for 循環(huán),得到選擇排序的算法如下:
html' target='_blank'>public static function sortSelect(array $arr) :array { if (!is_array($arr)) { return ['message' => '$arr不是一個(gè)數(shù)組']; } $count = count($arr); if ($count <= 1) { return $arr; } for ($i = 0; $i < $count; $i++) { $minIndex = $i; $min = $arr[$i]; for ($j = $i + 1; $j < $count; $j++) { if ($min > $arr[$j]) {//選擇的假定最小元素大于后面的元素 $min = $arr[$j];//把后面的最小元素賦值給假定的最小元素 $minIndex = $j;//把后面最小元素的坐標(biāo)賦值給假定的最小元素 } } if ($minIndex != $i) {//如果在這個(gè)位置,一開始的假定最小元素的坐標(biāo)被替換了,說明假定最小元素不是最小元素,那么發(fā)生交換 $arr[$minIndex] = $arr[$i];//交換最小元素,把最小元素和假定元素做交換 $arr[$i] = $min; } } return $arr; }
● 完整代碼如下:
<?phpclass SelectSort{ public static function select(array $arr):array { $count = count($arr); //假設(shè)最小的元素就是第二個(gè)元素 $minIndex = 0;//假設(shè)的最小元素的下表 $min = $arr[0];//假定最小元素的值 for ($j = $minIndex + 1; $j < $count; $j++) { if ($min > $arr[$j]) { //假定的最小值大于后面的值,重置最小值 $min = $arr[$j]; $minIndex = $j; } } if ($minIndex != 0) { $arr[$minIndex] = $arr[0];//假定的最小元素不是最小元素,那么把后面的最小元素和假定的最小元素做交換 $arr[0] = $min;//元素下標(biāo)交換 } var_dump($arr); $minIndex = 1;//假設(shè)的最小元素的下表 $min = $arr[1];//假定最小元素的值 for ($j = $minIndex + 1; $j < $count; $j++) { if ($min > $arr[$j]) { //假定的最小值大于后面的值,重置最小值 $min = $arr[$j]; $minIndex = $j; } } if ($minIndex != 1) { $arr[$minIndex] = $arr[1];//假定的最小元素不是最小元素,那么把后面的最小元素和假定的最小元素做交換 $arr[1] = $min;//元素下標(biāo)交換 } var_dump($arr); $minIndex = 2;//假設(shè)的最小元素的下表 $min = $arr[2];//假定最小元素的值 for ($j = $minIndex + 1; $j < $count; $j++) { if ($min > $arr[$j]) { //假定的最小值大于后面的值,重置最小值 $min = $arr[$j]; $minIndex = $j; } } if ($minIndex != 2) { $arr[$minIndex] = $arr[2];//假定的最小元素不是最小元素,那么把后面的最小元素和假定的最小元素做交換 $arr[2] = $min;//元素下標(biāo)交換 } var_dump($arr); return $arr; } public static function sortSelect(array $arr) :array { if (!is_array($arr)) { return ['message' => '$arr不是一個(gè)數(shù)組']; } $count = count($arr); if ($count <= 1) { return $arr; } for ($i = 0; $i < $count - 1; $i++) { $minIndex = $i; $min = $arr[$i]; for ($j = $i + 1; $j < $count; $j++) { if ($min > $arr[$j]) {//選擇的假定最小元素大于后面的元素 $min = $arr[$j];//把后面的最小元素賦值給假定的最小元素 $minIndex = $j;//把后面最小元素的坐標(biāo)賦值給假定的最小元素 } } if ($minIndex != $i) {//如果在這個(gè)位置,一開始的假定最小元素的坐標(biāo)被替換了,說明假定最小元素不是最小元素,那么發(fā)生交換 $arr[$minIndex] = $arr[$i];//交換最小元素,把最小元素和假定元素做交換 $arr[$i] = $min; } } return $arr; }}$arr = [3, 1, 15, 5, 20];var_dump(SelectSort::sortSelect($arr));
以上就是PHP 排序算法之選擇排序的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注 其它相關(guān)文章!
鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。
新聞熱點(diǎn)
疑難解答
圖片精選