归并排序
Posted w&y
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了归并排序相关的知识,希望对你有一定的参考价值。
1.将当前序列一分为二,求出分裂点mid = (low+high)/2;
2.对子序列R[low...mid]递归,进行递归排列;
3.对子序列R[mid+1...high]递归,进行递归排序;
4.调用算法merge合并两个子序列
举例
无序数组[6 2 4 1 5 9]
先看一下每个步骤下的状态,完了再看合并细节
第一步 [6 2 4 1 5 9]原始状态
第二步 [2 6] [1 4] [5 9]两两合并排序,排序细节后边介绍
第三步 [1 2 4 6] [5 9]继续两组两组合并
第四步 [1 2 4 5 6 9]合并完毕,排序完毕
输出结果[1 2 4 5 6 9]
代码:
1 <?php 2 /** 3 * 归并排序 4 */ 5 include "show.php"; 6 7 function merge_sort(&$data, $low, $high) 8 { 9 if ($low < ($high-1))//数组下标从0开始,所以是$low<$high-1 10 { 11 $mid = ceil(($low+$high)/2); 12 merge_sort($data, $low, $mid); 13 merge_sort($data, $mid+1, $high); 14 merge($data, $low, $mid, $high); 15 } 16 } 17 18 function merge(&$data, $low, $mid, $high) 19 { 20 $left = array();//左侧数组下标$low--->$mid 21 $right = array();//右侧数组下标$mid+1--->$high 22 for($i=$low; $i<=$high; ++$i) 23 { 24 if ($i <= $mid) 25 { 26 $left[] = $data[$i]; 27 } else { 28 $right[] = $data[$i]; 29 } 30 } 31 $i = $j = 0; 32 $left_length = count($left); 33 if ($left_length == 2) $left = temp_sort($left); 34 $right_length = count($right); 35 if ($right_length == 2) $right = temp_sort($right); 36 $k = $low; 37 //两个数组进行合并,直到有一个数组为空 38 while($i<$left_length && $j<$right_length) 39 { 40 if ($left[$i] < $right[$j]) 41 { 42 $data[$k] = $left[$i]; 43 ++$i; 44 } else { 45 $data[$k] = $right[$j]; 46 ++$j; 47 } 48 ++$k; 49 } 50 //将另一个非空的数组中余下的部分复制到$data中 51 while($i<$left_length) 52 { 53 $data[$k] = $left[$i]; 54 ++$i; 55 ++$k; 56 } 57 while($j<$right_length) 58 { 59 $data[$k] = $right[$j]; 60 ++$j; 61 ++$k; 62 } 63 } 64 //当元素只有两个的时候需要单独作排序 65 function temp_sort($data) 66 { 67 $res = $data; 68 if($data[0]>$data[1]) 69 { 70 $res = array($data[1], $data[0]); 71 } 72 return $res; 73 } 74 75 $arr = array(6,2,4,1,5,9); 76 show($arr); 77 merge_sort($arr, 0, count($arr)-1); 78 show($arr); 79
结果截图:
以上是关于归并排序的主要内容,如果未能解决你的问题,请参考以下文章