你王老师始终是你王老师,你自以为期中考试你的答辩题目弄成《论冒泡排序在社会主义建设中的贡献与作用》就可以拿到A+级了,然并卵,王老师还是仅仅给了你一个C及格级。

    毕竟,王老师那是见得多了,区区冒泡就敢来装高端搞大新闻?回家再修炼两年吧。

    2. 排序篇之选择排序 - 图1

    选择排序相对来说是一种思路比较简单粗暴明了清晰的排序算法,主题思路就是:从一坨数字中找出最小的放到第一位,然后从剩余数字中再找最小的放到第二位,依次继续,知道排序完毕。

    这不是特么废话么,哪个排序算法不是这么干的?

    • 首先,我们定义一个基准数A,并假装TA暂时就是最小的那个(一般情况自己不作死的话,就选第一个),定义一个变量min_index并将A的数组索引位置赋值给min_index
    • 然后,我们将min_index索引位置上的数字(第一轮其实就是A)依次(开始内循环)和剩余其他所有数字比较大小,如果基准数比某数字大了,那么(注意了⚠️⚠️⚠️)我们将某数字所在的数组索引位置赋值给min_index
    • 然后,现在最小值俨然已经发生了变化,然后循环继续重复前两个步骤一直到本轮终止结束

    不管你能不能看得懂我画的啥意思,反正我强烈你一定要画一画,纸笔演练:2. 排序篇之选择排序 - 图2

    1. <?php
    2. $arr = [ 6, 4, 7, 2, 9, 8, 1 ];
    3. $length = count( $arr );
    4. // 这里值得注意下,outer的最大值不能超过length-1而不是length,因为如果最后一个数字就剩最后一个了,不需要再拿出来判断大小
    5. for( $outer = 0; $outer < $length - 1; $outer++ ){
    6. // 先选择6为基准数字和基准位置
    7. $min_index = $outer;
    8. // 和后面的数字依次进行比较,这里值得注意的inner的最大值上限是length,而不能是length-1,仔细思考一下
    9. for( $inner = $outer + 1; $inner < $length; $inner++ ){
    10. // 如果最小基准位上的数比后面的数字大,那么,将后面数字的数组索引赋值给min_index
    11. if( $arr[ $min_index ] > $arr[ $inner ] ){
    12. $min_index = $inner;
    13. }
    14. }
    15. // 等所有内循环跑完毕后,判断最小数字的索引位置和 outer 是否相同,如果相同,说明outer位置上数就是最小的
    16. // 如果不一样,那么,min_index和outer两个位置的数字
    17. if( $min_index != $outer ){
    18. $temp = $arr[ $outer ];
    19. $arr[ $outer ] = $arr[ $min_index ];
    20. $arr[ $min_index ] = $temp;
    21. }
    22. }
    23. print_r( $arr );

    那么,话说回来,这个排序算法为啥就比冒泡排序屌呢?这里先卖个关子,最后总结的时候出个汇总。现在就临时用下面的代码做个简单的测试吧:

    1. <?php
    2. function bubble( $arr ){
    3. $length = count( $arr );
    4. $flag = true;
    5. for( $outer = 0; $outer < $length && $flag; $outer++ ){
    6. $flag = false;
    7. for( $inner = $length - 1; $inner > $outer; $inner-- ){
    8. if( $arr[ $inner ] < $arr[ $inner - 1 ] ){
    9. $temp = $arr[ $inner ];
    10. $arr[ $inner ] = $arr[ $inner - 1 ];
    11. $arr[ $inner - 1 ] = $temp;
    12. $flag = true;
    13. }
    14. }
    15. }
    16. return $arr;
    17. }
    18. function select( $arr ){
    19. $length = count( $arr );
    20. for( $outer = 0; $outer < $length - 1; $outer++ ){
    21. $min_index = $outer;
    22. for( $inner = $outer + 1; $inner < $length; $inner++ ){
    23. if( $arr[ $min_index ] > $arr[ $inner ] ){
    24. $min_index = $inner;
    25. }
    26. }
    27. if( $min_index != $outer ){
    28. $temp = $arr[ $outer ];
    29. $arr[ $outer ] = $arr[ $min_index ];
    30. $arr[ $min_index ] = $temp;
    31. }
    32. }
    33. return $arr;
    34. }
    35. $length = 200;
    36. for( $i = 0; $i < $length; $i++ ){
    37. $arr[] = mt_rand( 1,1000);
    38. }
    39. // 冒泡算法
    40. $begin = microtime( true );
    41. for( $i = 0; $i < $length; $i++ ){
    42. bubble( $arr );
    43. }
    44. $end = microtime( true );
    45. echo PHP_EOL.PHP_EOL.PHP_EOL."冒泡算法耗费时间:".( $end - $begin ).PHP_EOL;
    46. // 选择算法
    47. $begin = microtime( true );
    48. for( $i = 0; $i < $length; $i++ ){
    49. select( $arr );
    50. }
    51. $end = microtime( true );
    52. echo "选择算法耗费时间:".( $end - $begin ).PHP_EOL.PHP_EOL.PHP_EOL;

    运行结果如下图所示:

    2. 排序篇之选择排序 - 图3

    200条数据,就能差出一半时间来,吓人不?王老师终究是你王老师,嫩还是嫩了点儿的。