zoukankan      html  css  js  c++  java
  • 快速排序

    选择排序

         它的工作原理是:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零

      举例说明: $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
        function selection_sort($arr)
        {
            $arrLength = count($arr);
            for ($i = 0; $i < $arrLength - 1; $i++) {
                //定义最小位置,即每次循环的第一个位
                $minimum = $i;
                //当前循环开始位置j
                for ($j = $i + 1; $j < $arrLength; $j++) {
                    if ($arr[$j] < $arr[$minimum]) {//循环刚开始时,因为arr[j]与arr[mini]指向同一个数,没必要比较,所以上面的j=i+1
                        $minimum = $j;
                    }
                }
                //如果最小数的下标不是第一个数的下标,就交换两者的值
                if ($i != $minimum) {
                    $temp = $arr[$i];
                    $arr[$i] = $arr[$minimum];
                    $arr[$minimum] = $temp;
                }
            }
    
            return $arr;
        }
        $array = array(61, 17, 29, 22, 34, 60, 72, 21, 50, 1, 62 ,2, 6, 12, 8);
        var_dump(selection_sort($array));

    不稳定

    举个例子,序列5 8 5 2 9, 我们知道第一遍选择第1个元素5会和2交换,那么原序列中2个5的相对前后顺序就被破坏了,所以选择排序不是一个稳定的排序算法

    快速排序是一种原地排序,只需要一个很小的栈作为辅助空间,空间复杂度为O(log2n),所以适合在数据集比较大的时候使用。

  • 相关阅读:
    [转载] 论C#与Java之异同
    MultiThread WebRequest : Timeout
    FCL(2) :: CollectionBase & Collection
    msn 81000306 无法登录,解决方法
    接口一个被我忽略的地方接口重定向技术
    <<Clr Via C#>> Key Points (1) (46章)
    FCL(3):: ArrayList & List (1)
    TCP保活机制
    子网划分
    freopen函数
  • 原文地址:https://www.cnblogs.com/caijiqi190731/p/11327824.html
Copyright © 2011-2022 走看看