首页 > 代码库 > 归并排序

归并排序

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     
View Code

结果截图:

技术分享

归并排序