php排序算法之选择排序

目录

一: 原理

二: 举例说明

三: PHP代码实现选择排序


一: 原理

       选择排序:在一列数字中,选出最小数与第一个位置的数交换然后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。(以下都是升序排列,即从小到大排列);

二: 举例说明

$arr = array(6, 3, 8, 2, 9, 1);

第一轮:

  • 第一次比较, 第一个数 6 与(3,  8,  2,  9,  1)中 3 比较,6大,当前最小数为3,位置为 1  
  • 第二次比较, 最小数字 3 与(3,  8,  2,  9,  1)中 8 比较,3小,当前最小数为3,位置为 1   
  • 第三次比较, 最小数字 3 与(3,  8,  2,  9,  1)中 2 比较,3大,当前最小数为2,位置为 3
  • 第四次比较, 最小数字 2 与(3,  8,  2,  9,  1)中 9 比较,2小,当前最小数为2,位置为 3
  • 第五次比较, 最小数字 2 与(3,  8,  2,  9,  1)中 1 比较,2大,当前最小数为1,位置为 5

总结: 

1.第一轮比较完成后,确定最小数为1,小于第一个数6,交换位置上的数,交换后结果为 1  3  8  2  9  6

2.第一轮比较,可以确定第一个位置的最小值

 

第二轮:

  • 第一次比较, 3与(8,  2,  9,  6)中 8 比较,3小,当前最小数为3,位置为 1
  • 第二次比较, 3与(8,  2,  9,  6)中 2 比较,3大,当前最小数为2,位置为 3
  • 第三次比较, 2与(8,  2,  9,  6)中 9 比较,2小,当前最小数为2,位置为 3
  • 第四次比较, 2与(8,  2,  9,  6)中 6 比较,2小,当前最小数为2,位置为 3

总结:

1.第二轮比较完成后,确定最小数为2,小于第二个数3,交换位置上的数,交换后结果为 1  2  8  3  9  6

2.第二轮比较,可以确定第二个位置的最小值。至此确定了前两个位置上的数。

   

第三轮:

  • 第一次比较, 8与( 3,  9,  6)中 3 比较,8大,当前最小数为3,位置为3
  • 第二次比较, 3与( 3,  9,  6)中 9 比较,3小,当前最小数为3,位置为3
  • 第三次比较, 3与( 3,  9,  6)中 6 比较,3小,当前最小数为3,位置为3

总结:

1.第三轮比较完成后,确定最小数为3,小于第三个数8,交换位置上的数,交换后结果为 1  2  3  8  9  6

2.第三轮比较,可以确定第三个位置的最小值。至此确定了前三个位置上的数。

 

第四轮:

  • 第一次比较, 8与( 9,  6)中 9 比较,8小,当前最小数为8,位置为3
  • 第二次比较, 8与( 9,  6)中 6 比较,8大,当前最小数为6,位置为5

总结:

1. 第四轮比较完成后,确定最小数为6,小于第四个数8交换位置上的数,交换后结果为 1  2  3  6  9  8

2.第四轮比较,可以确定第四个个位置的最小值。至此确定了前四个位置上的数。
 

第五轮:

  • 第一次比较, 9与 8 比较,9大,当前最小数为8,位置为5

总结:

1.第五轮比较完成后,确定最小数为8,小于第五个数9,交换位置上的数,交换后结果为 1  2  3  6  8  9

2.第五轮比较,可以确定第五个个位置的最小值。至此确定了前5个位置上的数。
 

综合以上五轮比较,每一轮比较都可以确定一个位置,对于N个数,比较N-1轮可以确定N个位置上的数,因为确定了N-1个位置,最后一个位置也就确定了。

三: PHP代码实现选择排序

<?php
function selectionSort(&$arr){
//判断是否为空
if(empty($arr)){
   return $arr;
}
//如果为1直接返回$arr
if(count($arr)==1){
   return $arr;
}
//定义中间变量
$temp = 0;
$count = count($arr);
$len = $count-1;
//双重循环完成,外层控制轮数,内层控制比较次数
for($i=0; $i<$len; $i++)
{
  //先假设最小的值的位置
  $minIndex = $i;         
  for($j= $i+1; $j<$count; $j++)
  {
  	// //$arr[$minIndex] 是当前已知的最小值
     if($arr[$j] < $arr[$minIndex])
     {
     	/**
     	 * 比较,发现更小的,记录下最小值的位置;
     	 * 并且在下次比较时采用已知的最小值进行比较。
     	 */
         $minIndex = $j;
     }
  }

 /**
  *已经确定了当前的最小值的位置,保存到$minIndex中。
  *如果发现最小值的位置与当前假设的位置$i不同,则位置互换即可。
  */       

   if($i != $minIndex)
   {
 	   //进行交换 
       $temp = $arr[$i];
       $arr[$i] = $arr[$minIndex];
       $arr[$minIndex] = $temp;               
   }
}
return $arr;
}   

//调用选择排序函数,实现升序排列数组元素
$arr = array(2, 3, 8, 12, 9, 1);     
selectionSort($arr);
print_r($arr);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值