视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
PHP 排序算法之选择排序
2020-11-03 18:23:20 责编:小采
文档


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));

下载本文
显示全文
专题