往前。
<?php /** * 选择排序 * 工作原理是每次从待排序的元素中的第一个元素设置为最小值, * 遍历每一个没有排序过的元素,如果元素小于现在的最小值, * 就将这个元素设置成为最小值,遍历结束就将最小值和第一个没有排过序交换位置, * 这样的遍历需要进行元素个数-1次 * 这是一个不稳定的排序算法(排序后相对次序改变了) * 对于选择排序如何找到最小元是关键 所以我们需要使用堆排序 */ //生成指定区间不重复数组 function uniqueRandom($min, $max, $num) { $count = 0; $return = []; while($count < $num) { //生成指定数值期间的随机数 $return[] = mt_rand($min, $max); //用两次键值翻转,去除数组中重复的数据项 $return = array_flip(array_flip($return)); $count = count($return); } //再次作一下随机排序 shuffle($return); return $return; } //选择排序 function selectionSort(&$arr) { $count = count($arr); for ($j = 0; $j < $count; $j++) { //把第一个没有排过序的元素设置为最小值 $minPos = $j; //遍历每一个没有排过序的元素 for ($i = $j + 1; $i < $count; $i++) { //如果这个值小于最小值 if ($arr[$i] < $arr[$minPos]) { //把最小值的位置设置为这个元素的位置 $minPos = $i; } } //内循环结束把最小值和没有排过序的元素交换 if ($minPos != $j) { list($arr[$j], $arr[$minPos]) = [$arr[$minPos], $arr[$j]]; } } } $arr = uniqueRandom(1, 100000, 5000); $start = microtime(true); selectionSort($arr); $end = microtime(true); $used = $end - $start; echo "selectionSort() used $used s" . PHP_EOL; echo '<br/>'; /* for ($i = 0; $i < count($arr)/100; $i++) { echo $arr[$i] . '<br/>'; } */ //php内置排序, 性能超过自己写的好多倍~~:() $arr = uniqueRandom(1, 100000, 5000); $start = microtime(true); asort($arr); $end = microtime(true); $used = $end - $start; echo "asort() used $used s" . PHP_EOL; echo '<br/>'; ?>
输出
selectionSort() used 0.52305197715759 s asort() used 0.0010001659393311 s