PHP实现归并排序
来源:互联网 发布:电脑报淘宝生活馆 编辑:程序博客网 时间:2024/06/07 15:13
归并排序先分解要排序的序列,从1分成2,2分成4,依次分解,当分解到只有1个一组的时候,就可以排序这些分组,然后依次合并回原来的序列中,这样就可以排序所有数据。合并排序比堆排序稍微快一点,但是需要比堆排序多一倍的内存空间,因为它需要一个额外的数组。时间复杂度是 O(nlogn),空间复杂度O(n)。
//归并算法总函数function MergeSort(array &$arr){ $start = 0; $end = count($arr) - 1; MSort($arr, $start, $end);}// 将数组分半再分半(直到子序列长度为1),然后将子序列合并起来。function MSort(array &$arr, $start, $end){ //当子序列长度为1时,$start == $end,不用再分组 if($start < $end){ $mid = $start + (($end - $start)>>1); MSort($arr, $start, $mid); MSort($arr, $mid + 1, $end); Merge($arr, $start, $mid, $end); }}//归并操作function Merge(array &$arr, $start, $mid, $end){ $i = $start; $j=$mid + 1; $k = $start; $temparr = array(); while($i != $mid+1 && $j != $end+1) { if($arr[$i] >= $arr[$j]){ $temparr[$k++] = $arr[$j++]; } else{ $temparr[$k++] = $arr[$i++]; } } //将第一个子序列的剩余部分添加到已经排好序的 $temparr 数组中 while($i != $mid+1){ $temparr[$k++] = $arr[$i++]; } //将第二个子序列的剩余部分添加到已经排好序的 $temparr 数组中 while($j != $end+1){ $temparr[$k++] = $arr[$j++]; } for($i=$start; $i <= $end; $i++){ $arr[$i] = $temparr[$i]; }}$arr = array(9,1,5,8,3,7,45,6,2);MergeSort($arr);print_r($arr);优化一:
function MSort(array &$arr, $start, $end){ //当子序列长度为1时,$start == $end,不用再分组 if($start < $end){ $mid = $start + (($end - $start)>>1); MSort($arr, $start, $mid); MSort($arr, $mid + 1, $end);//两边的子序列都是有序的,如果左边的最大的元素比右边最小的元素大才需要合并 if ($arr[$mid] > $arr[$mid+1]) {Merge($arr, $start, $mid, $end); } }}优化二:
可以在Msort()里面加上以下的代码
//子序列长度小的时候可以调用插入排序,不用再二分序列和归并
if($end - $start<= 20) {
InsertSort($arr,$start, $end);
}
阅读全文
0 0
- 【归并排序】php实现
- php实现归并排序
- php实现归并排序
- PHP实现归并排序
- PHP归并排序的实现
- php实现归并排序(二)
- 举例详解PHP归并排序的实现
- PHP实现归并排序(合并排序)--算法原理分析
- PHP实现排序算法----归并排序(Merging Sort)
- PHP 归并排序
- php归并排序
- 归并排序(php)
- PHP排序之归并排序
- 经典算法归并排序的分析及PHP实现
- 归并排序的实现
- 归并排序Java实现
- 归并排序的实现
- 【归并排序+实现】
- lucene功能二:查询索引步骤;及代码示例
- ismobile跳转
- lucene 第三个功能,中文分词器及代码示例
- POJ推荐50题 1. 标记“难”和“稍难”的题目可以看看,思考一下,不做要求,当然有能力的同学可以直接切掉。 2. 标记为 A and B 的题目是比较相似的题目,建议大家两个一起做,可以对比总结,
- QTreeView处理大量数据
- PHP实现归并排序
- 【备忘】亿级流量电商系统大型高并发与高可用缓存架构实战
- CentOS 7下FTP服务器的安装配置
- 编译链接过程
- MySQL中修改多个数据表的字段拼接问题
- 分数化小数
- microPython VS lua
- poj 2114 Boatherds(树分治)
- [Paper Note] Batch normalization(未完成)