function SelectSort($numbers){ $n = count($numbers); for( $i = 0 ; $i < $n ; $i++){ $k = $i; for( $j = $i+1 ; $j < $n ; $j++){ if($numbers[$j] < $numbers[$k]){ $k = $j; } } if($k != $i){ list($numbers[$i], $numbers[$k]) = [$numbers[$k], $numbers[$i]]; } } echo implode(', ', $numbers), PHP_EOL;}SelectSort($numbers);// 13, 27, 38, 49, 49, 65, 76, 97
代码不繁芜吧,可以把稳到它也有交流代码的涌现。我们利用的是上篇文章中的小彩蛋中的交流办法进行的数据位置的交流。它和冒泡以及快排那种专门的交流型排序算法还是有些许不同的,每次交流的 i 这个位置是不变的,什么意思呢?比如我们现在的 i 是 0 ,也便是说全体序列中最小的数据该当是要放在这个地方的。以是 j 循环是从 i + 1 的位置开始循环的,然后一直地和 i 这个位置的数据进行比较,并不断地更新 k ( k 在一开始是指定为 i 的)。找到最小的数据之后直接将这个数据和 i 的数据交流,这样最小的数据就放到了 i 的位置上了。这便是大略选择排序的核心思想。
这一大段提及来可能会看得比较懵圈。还是看看图吧!
我们依然还是以第一趟的详细过程为例。

k = i ,然后 j 从第二个数据开始遍历
如果创造 numbers[j] 小于 numbers[k] 的数据,也便是更小的数据,就让 k = j
j 循环遍历完成后,k 指向的下标便是最小那个数据,于是交流 k 和 i 的值
一趟排序下来,最小的数据就放到了最前面的位置了
是不是觉得和冒泡有点像呀?确实是很像,冒泡也是一趟外层循环就可以把某个最大或者最小的值放到精确的位置上。不过须要把稳的是,冒泡是前后两个数据比较,很有可能每次比较都会发生交流。而选择排序则因此一个下标指针的位置移动来确定数据,末了也只进行一次交流。以是说,它是有选择性的交流,而不是纯粹的一起交流到底。
大略桶排序真正的桶排序还是比较繁芜的,但本日我们学习的这个大略的桶排序则是真的大略的弗成。它表示的是一种以空间换韶光的办法,详细是怎么换的呢?
function BucketSort($numbers){ $bucketList = []; $maxValue = max($numbers); for($i=0;$i <= $maxValue;$i++){ $bucketList[$i] = 0; } foreach($numbers as $n){ $bucketList[$n]++; } $sortList = []; foreach($bucketList as $k => $v){ if($v > 0){ for( ; $v > 0 ; $v--){ $sortList[] = $k; } } } echo implode(', ', $sortList), PHP_EOL;}
如果是针对的数字类型的排序操作,特殊是这个数字基数不大,比如说是类型列举之类的数据,我们都可以利用这种桶排序的办法。首先我们要看当前最大的数字是几,然后初始化一个数组到这个最大数字的下标,并将所有内容设置为 0 。接着遍历原始的排序数组,给这个要排序数据对应的值加 1 。于是,待排序序列所代表的那些键的值都会变成 1 ,同时,如果有相同的数据,我们利用的是 ++ 操作,这个数据对应的键值就会连续加 1 。详细的过程就如下图所示:
相信这个图已经解释得非常清晰了吧,也不须要我们再深入地阐明了吧。这便是这种最大略的桶排序办法,我们也可以将这个桶数组的内容换成二维数据,这样我们就可以实现更繁芜数据的排序操作了。不过还是要把稳,一定是针对数字类型的哦。我们先容的这种桶排序实在是真正的桶排序的一种变体,也有人叫它为“计数排序”。
真正更加完备一些的桶排序实在是先将数据分身分歧的组,每个组可以算作是一个桶。然后在这个桶内将组内的数据排序,排序完成之后再将这些组(桶)连接起来。它的韶光繁芜度是靠近于 O(n) 的。不过就像我们先容的这个最大略的桶排序一样,繁芜的桶排序也是有许多严苛的哀求的,以是虽然它的效果很高,但却并不常见。
总结本日的内容非常大略吧,大略选择实在也是一种交流排序,但它在大类中还是划归到了选择排序这个类型中。而桶排序是属于基数排序的一种。各种排序实在还有很多,但除了我们学习的这些之外,其它的都会更加的繁芜也并不常见,大家有兴趣的可以不才期我们的总结文章中理解到有哪些可以连续深入学习的内容。精彩还在连续,不要错过哦!
测试代码:
https://github.com/zhangyue0503/Data-structure-and-algorithm/blob/master/7.排序/source/7.3其它排序:大略选择、桶排序.php
参考文档:
《数据构造》第二版,严蔚敏
《数据构造》第二版,陈越
《啊哈!
算法》