归并排序算法
来源:互联网 发布:知乎为什么中国dota 编辑:程序博客网 时间:2024/05/19 16:50
归并排序法(Merge Sort,以下简称MS)是分治法思想运用的一个典范。其主要算法操作可以分为以下步骤:
Step 1:将n个元素分成两个含n/2元素的子序列
Step 2:用MS将两个子序列递归排序(最后可以将整个原序列分解成n个子序列)
Step 3:合并两个已排序好的序列
易知,MS的关键在于Merge过程。对于这一过程的理解,算法导论中给出了一个形象的模型。
即假设桌面上有两堆已排序好的的牌,且每一堆都正面朝下放置。然后我们分别从两堆牌中选取顶上的一张牌(选取之后,堆顶端又会露出新的顶牌),选取较小的一张,放入输出堆,另一张放回。
重复这一步骤,最后直到一堆牌为空。由于两堆牌都是已排序,所以可知,只要将剩下的那堆牌盖到输出堆即完成整个排序过程。
Java实现:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
import
java.util.*;
public
class
MergeSort {
public
int
[] mergeSort(
int
[] A,
int
n) {
// write code here
sort(A,
0
,n-
1
);
return
A;
}
public
void
sort(
int
[] data,
int
left,
int
right){
if
(left<right){
int
middle=(left+right)/
2
;
//划分左右
sort(data,left,middle);
sort(data,middle+
1
,right);
//合并左右
merge(data,left,middle,right);
}
}
//合并左右两个子数组
public
void
merge(
int
[] data,
int
left,
int
middle,
int
right){
//临时数组
int
[] tempArr=
new
int
[right-left+
1
];
//左边数组游标
int
leftIndex=left;
//右边数据游标
int
rightIndex=middle+
1
;
//临时数组游标
int
tempIndex=
0
;
while
(leftIndex<=middle&&rightIndex<=right){
//临时数组选取左、右子数组中小数值
if
(data[leftIndex]<data[rightIndex]){
tempArr[tempIndex++]=data[leftIndex++];
}
else
{
tempArr[tempIndex++]=data[rightIndex++];
}
}
//剩余的直接放入
while
(leftIndex<=middle){
tempArr[tempIndex++]=data[leftIndex++];
}
//剩余的直接放入
while
(rightIndex<=right){
tempArr[tempIndex++]=data[rightIndex++];
}
//将临时数组放回原数组相应位置
int
temp=
0
;
while
((temp+left)<=right){
data[left+temp]=tempArr[temp];
temp++;
}
}
}
0 0
- 排序算法-归并排序
- 排序算法------归并排序
- 排序算法-归并排序
- 排序算法---归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- 排序算法-归并排序
- 排序算法:归并排序
- 【排序算法】归并排序
- 排序算法--归并排序
- 排序算法-归并排序
- 排序算法--归并排序
- 排序算法:归并排序
- 【排序算法】归并排序
- Meteor 用户登录注册密码验证 php版本
- 怎样退出终止App
- nginx开发(四)调用ffmpeg,搭建rtmp直播流。
- spark操作mysql
- 9.以表格-树-表格表单三级主细为模板定制模块:文件目录三级管理
- 归并排序算法
- IOS(UI)_模态推送
- 备份多个数据库文件并新建文件夹日期命名保存
- 部分设计模式介绍
- Linux Desktop Entry 文件深入解析
- 内核空间与用户空间
- 几句话弄清楚Java参数传值还是传引用
- Mac下终端设置颜色
- scala class隐式类