本文主要介绍了一些常用的排序算法,以及PHP的代码实现等,希望对您能有所帮助。
本文来自于awaimai.com,由火龙果软件Luca编辑推荐。
作为phper,一般接触算法的编程不多。
但基本的排序算法还是应该掌握。
毕竟算法作为程序的核心,算法的好坏决定了程序的质量。
本文将依次介绍一些常用的排序算法,以及PHP实现。
1 快速排序
快速排序是由东尼·霍尔发展的一种排序算法。
在平均状况下,排序 n 个项目要Ο(n log n)次比较。
在最坏状况下则需要Ο(n2)次比较,但这种状况并不常见。
事实上,快速排序通常明显比其他Ο(n log n) 算法更快,因为它的内部循环可以在大部分的架构上,很有效率地被实现出来。
快速排序采用分治法实现排序,具体步骤:
从数列中挑出一个数作为基准元素。通常选择第一个或最后一个元素。
扫描数列,以基准元素为比较对象,把数列分成两个区。规则是:小的移动到基准元素前面,大的移到后面,相等的前后都可以。分区完成之后,基准元素就处于数列的中间位置。
然后再用同样的方法,递归地排序划分的两部分。
递归的结束条件是数列的大小是0或1,也就是永远都已经被排序好了。
PHP代码实现:
function quickSort($arr) { $len = count($arr); // 先设定结束条件,判断是否需要继续进行 if($len <= 1) { return $arr; } // 选择第一个元素作为基准元素 $pivot = $arr[0]; // 初始化左数组 $left = $right = array(); // 初始化大于基准元素的右数组 $right = array(); // 遍历除基准元素外的所有元素,按照大小关系放入左右数组内 for ($i = 1; $i < $len ; $i++) { if ($arr[$i] < $pivot) { $left[] = $arr[$i]; } else { $right[] = $arr[$i]; } } // 再分别对左右数组进行相同的排序 $left = quickSort($left); $right = quickSort($right); // 合并基准元素和左右数组 return array_merge($left, array($pivot), $right); }
原地排序版本,不需要额外的存储空间:
function partition(&$arr, $leftIndex, $rightIndex) { $pivot = $arr[($leftIndex + $rightIndex) / 2]; while ($leftIndex <= $rightIndex) { while ($arr[$leftIndex] < $pivot) { $leftIndex++; } while ($arr[$rightIndex] > $pivot) { $rightIndex--; } if ($leftIndex <= $rightIndex) { list($arr[$leftIndex], $arr[$rightIndex]) = [$arr[$rightIndex], $arr[$leftIndex]]; $leftIndex++; $rightIndex--; } } return $leftIndex; } function quickSort(&$arr, $leftIndex, $rightIndex) { if ($leftIndex < $rightIndex) { $index = partition($arr, $leftIndex, $rightIndex); quickSort($arr, $leftIndex, $index - 1); quickSort($arr, $index, $rightIndex); } }
内容版权声明:除非注明,否则皆为本站原创文章。