排序学习之---选择排序

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,小于第一个数6,交换位置上的数,交换后结果为 1  3  8  2  9  6

     总结:第一轮比较,可以确定第一个位置的最小值。

   第二轮:

   第一次比较, 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

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

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

    第三轮:

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

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

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

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

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

     第四轮:

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

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

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

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

    第五轮:

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

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

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

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

<?php
/**
 * Created by PhpStorm.
 * User: brady
 * Date: 2018/10/10
 * Time: 10:22
 */
error_reporting(E_ALL);
ini_set('display_errors', '1');
/**
 * @author brady
 * @param $arr 待排序的数组
 * @param string $sort 排序顺序 asc升序 desc降序
 * @time  2018/10/10
 * 每一轮比较都可以确定一个位置,对于N个数,比较N-1轮可以确定N个位置上的数,因为确定了N-1个位置,最后一个位置也就确定了
 */
function select_sort($arr,$sort='asc')
{
    $len = count($arr);
    for($i=0;$i<$len-1;$i++){ // 外层循环 循环n-1次
        $min_position = $i; //定义最小位置为当前外层循环的最后一个
        for($j=$i+1;$j<$len;$j++){ //内层循环每次从外层要比较的下一个元素开始 找到最小的一个元素的位置,

            if($sort == 'asc'){
                if($arr[$j] < $arr[$min_position]){
                    $min_position = $j;
                }

            } else {
                if($arr[$j] > $arr[$min_position]){
                    $min_position = $j;
                }
            }

        }


        //循环结束 交换$arr[$i]和最小位置的值 如果两者位置不相等
        echo "第".($i+1)."轮循环找到最小的值".$arr[$min_position]."和位置".$i."的".$arr[$i]."进行交换 交换前".json_encode($arr);
        if($i != $min_position){

            $temp = $arr[$i];
            $arr[$i] = $arr[$min_position];
            $arr[$min_position] = $temp;

        }
        echo json_encode($arr).    "<hr>";


    }
    return $arr;
}

$arr = [8,7,4,5,6,3,2,1];
echo "排序前".json_encode($arr)."<hr>";
$res = select_sort($arr,'desc');
echo "排序后".json_encode($res);

猜你喜欢

转载自www.cnblogs.com/php-linux/p/9765285.html