抉择排序 select sorting
● 抉择排序也是外部排序
● 排序思维:
第一次先随意抉择一个数,就是正在要排序的数组落选择一个元素以及数组的其它元素比拟。而后比拟替换地位失去最小值或许最年夜值,而后再次正在剩下的数组中,抉择一个数以及数组剩下的元素比拟,最初失去第二个最小或最年夜的元素。顺次类推
● 表示图:
抉择排序一共无数组巨细 - 1 轮排序;每一一轮排序又是一个轮回;先假设以后的这个数组就是最小数,而后以及前面的元素顺次比拟,假如发现有比以后数更小的数,就从新确定最小数,并失去下标,当遍历到数组的最初时,就失去本轮最小数以及下标,替换
1. 假定有一个待排序的数组 [3, 1, 15, 5, 20]
2. 随机抉择一个元素,假定第一个就是最小的元素,拿 3 以及数组剩下的元素比拟,第一轮排序后失去最小元素 1
<?php $arr = [3, 1, 15, 5, 20]; $count = count($arr); //假定最小的元素就是第一个元素 $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. 再次抉择一个假设最小值,与前面的元素一次比拟,失去第二个最小值
<?php $arr = [1, 3, 15, 5, 20]; $count = count($arr); //假定最小的元素就是第二个元素 $minIndex = 1;//假定的最小元素的下表 $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;//元素下标替换 }
4. 以此类推,就能够应用两重 for 轮回,失去抉择排序的算法以下:
public static function sortSelect(array $arr) :array { if (!is_array($arr)) { return ['message' => '$arr没有是一个数组']; } $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;//把前面最小元素的坐标赋值准假定的最小元素 } } if ($minIndex != $i) {//假如正在这个地位,一开端的假设最小元素的坐标被交换了,阐明假设最小元素没有是最小元素,那末发作替换 $arr[$minIndex] = $arr[$i];//替换最小元素,把最小元素以及假设元素做替换 $arr[$i] = $min; } } return $arr; }
● 完好代码以下:
<?php class SelectSort { public static function select(array $arr):array { $count = count($arr); //假定最小的元素就是第二个元素 $minIndex = 0;//假定的最小元素的下表 $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;//元素下标替换 } var_dump($arr); $minIndex = 1;//假定的最小元素的下表 $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;//元素下标替换 } var_dump($arr); $minIndex = 2;//假定的最小元素的下表 $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;//元素下标替换 } var_dump($arr); return $arr; } public static function sortSelect(array $arr) :array { if (!is_array($arr)) { return ['message' => '$arr没有是一个数组']; } $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;//把前面最小元素的坐标赋值准假定的最小元素 } } if ($minIndex != $i) {//假如正在这个地位,一开端的假设最小元素的坐标被交换了,阐明假设最小元素没有是最小元素,那末发作替换 $arr[$minIndex] = $arr[$i];//替换最小元素,把最小元素以及假设元素做替换 $arr[$i] = $min; } } return $arr; } } $arr = [3, 1, 15, 5, 20]; var_dump(SelectSort::sortSelect($arr));
以上就是PHP 排序算法之抉择排序的具体内容,更多请存眷资源魔其它相干文章!
标签: php php开发教程 php开发资料 php开发自学
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
抱歉,评论功能暂时关闭!