热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

二路归并排序(MergeSort)

归并排序,可分为递归(分解)和合并两个操作过程.1.递归操作过程(分解序列)将一个序列分成两个序列将两个序列分成四个序列直到将长度为n的序列分为n个不可再分的子序列后停止再分

归并排序,可分为递归(分解)合并两个操作过程.

1.递归操作过程(分解序列)

  1. 将一个序列分成两个序列
  2. 将两个序列分成四个序列
  3. ...
  4. 直到将长度为n的序列分为n不可再分的子序列后停止再分,此时每个子序列中都只含有1个元素.可视该子序列为一个有序序列.
  5. 对两两相邻的两个有序子序列进行合并操作,得到的每个有序序列中都含有2个元素.
  6. 将得到的有序序列再次进行合并操作,得到的每个有序序列中都含有4个元素.
  7. ...
  8. 直到合并了所有的有序序列时为止,则得到了结果.

2.合并操作过程(合并序列)

  • 摘至:http://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F
  1. 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列
  2. 设定两个指针,最初位置分别为两个已经排序序列的起始位置
  3. 比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置
  4. 重复步骤3直到某一指针达到序列尾
  5. 将另一序列剩下的所有元素直接复制到合并序列尾

C++代码如下:

 

1 #include
2
3 // 将两个有序序列进行合并
4 void Merge(int arr[], int first, int mid, int last)
5 {
6 int i1 = first;
7 int i2 = mid + 1;
8 int m = mid;
9 int n = last;
10 int i3 = 0;
11
12 int *temp = new int[last - first + 1];
13
14 while(i1 <&#61; m && i2 <&#61; n)
15 {
16 if (arr[i1] < arr[i2])
17 temp[i3&#43;&#43;] &#61; arr[i1&#43;&#43;];
18 else
19 temp[i3&#43;&#43;] &#61; arr[i2&#43;&#43;];
20 }
21 while(i1 <&#61; m)
22 temp[i3&#43;&#43;] &#61; arr[i1&#43;&#43;];
23 while(i2 <&#61; n)
24 temp[i3&#43;&#43;] &#61; arr[i2&#43;&#43;];
25 for(i1&#61;0; i1)
26 arr[first &#43; i1] &#61; temp[i1];
27
28 delete [] temp;
29
30 }
31
32 void MergeSort(int arr[], int first, int last)
33 {
34 if (first < last)
35 {
36 int mid &#61; (first &#43; last) / 2;
37 MergeSort(arr, first, mid);
38 MergeSort(arr, mid &#43; 1, last);
39 Merge(arr, first, mid, last);
40 }
41 }
42
43 // 在主函数中测试
44 void main()
45 {
46 int arr[] &#61; {9, 1, 6, 5, 7, 3, 8, 2, 4, 0};
47 MergeSort(arr, 0, 9);
48 // 输出排序后数组的内容
49 for(int i&#61;0; i<10; i&#43;&#43;)
50 printf("%d ", arr[i]);
51
52 getchar();
53 }

 


 

转:https://www.cnblogs.com/rookie2/archive/2012/09/27/2699585.html



推荐阅读
author-avatar
v88v的秋天
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有