插入排序和选择排序
插入排序:
插入排序的基本操作就是将一个数据插入到已经排好序的有序数据中,从而得到一个新的、个数加一的有序数据。
⒈ 从第一个元素开始,该元素可以认为已经被排序
⒉ 取出下一个元素,在已经排序的元素序列中从后向前扫描
⒊ 如果该元素(已排序)大于新元素,将该元素移到下一位置
⒋ 重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
⒌ 将新元素插入到下一位置中
⒍ 重复步骤2
function insert_sort($arr) { //默认第一个元素已排序,所以$i从1开始 for($i=1, $len=count($arr); $i<$len; $i++) { //获得当前需要比较的元素值,此处要用$tmp接收,不能直接用$arr[$i]在里边的循环中运算, //因为内层循环如果判断需要交换顺序时会改变$arr的原有顺序,不能确定$arr[$i]是什么值 $tmp = $arr[$i]; //内层循环控制,$i的数字可以代表已经被排序了的个数, //所以这层循环是要把$tmp跟已经排序的元素一一比较,交换位置 //因为已排序的元素是从小到大,所以从最后一个开始比较,减少循环次数
//如果$tmp小就向前移动,如果大就不用管,因为已经是有序的了。
for($j=$i-1;$j>=0;$j--) { if($tmp < $arr[$j]) { //发现插入的元素要小,交换位置 $arr[$j+1] = $arr[$j]; $arr[$j] = $tmp; } else { //没有交换就退出 break; } } } return $arr; }
选择排序
选择排序法的思路就是在第一次循环中,假设第一个数是最小的;然后跟第二个数比较,一直比到最后,找出最小值,然后把最小值跟第一个数的位置互换;再进行下一次循环,找出最小值跟第二个位置的数互换;一直循环数组的个数减去1次;数组就成了有序的了;
<?php $arr=array(3,1,7,-1); //示例数组 //因为跟第一个数比较,外层循环就少一次,$i还是从0开始是为了写时方便,不影响取值 for ($i=0;$i<count($arr)-1;$i++){ $min=$arr[$i]; //取出作为比较的第一个值 $mindex=$i; //取出下标 //内层循环从$i+1个开始取剩下的值比较 for ($j=$i+1;$j<count($arr);$j++){ if ($min >$arr[$j]){ //如果小于最小值就把最小值改掉 $min=$arr[$j]; $mindex=$j; } } //交换第一个值和找到的最小值 $temp=$arr[$i]; $arr[$i]=$arr[$mindex]; $arr[$mindex]=$temp; } print_r($arr); //[-1, 1, 3, 7]