Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
GreyZeng
algorithm
提交
f84e8bd5
A
algorithm
项目概览
GreyZeng
/
algorithm
通知
10
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
A
algorithm
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f84e8bd5
编写于
1月 06, 2024
作者:
GreyZeng
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update notes
上级
2b276c65
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
44 addition
and
32 deletion
+44
-32
src/main/java/git/snippet/mergesort/Code_MergeSort.java
src/main/java/git/snippet/mergesort/Code_MergeSort.java
+44
-32
未找到文件。
src/main/java/git/snippet/mergesort/Code_MergeSort.java
浏览文件 @
f84e8bd5
...
...
@@ -50,51 +50,63 @@ public class Code_MergeSort {
}
//
非递归方法实现
//
归并排序的迭代版
public
static
void
mergeSort2
(
int
[]
arr
)
{
if
(
null
!=
arr
&&
arr
.
length
>
1
)
{
int
group
=
1
;
int
len
=
arr
.
length
;
while
(
group
<
len
)
{
int
ls
=
0
;
while
(
ls
<
len
)
{
if
(
ls
+
group
>=
len
)
{
break
;
}
int
mid
=
ls
+
group
-
1
;
int
le
=
Math
.
min
(
mid
+
group
,
len
-
1
);
merge
(
arr
,
ls
,
mid
,
le
);
ls
=
le
+
1
;
}
if
(
group
*
2
>
len
)
{
if
(
arr
==
null
||
arr
.
length
<
2
)
{
return
;
}
int
len
=
arr
.
length
;
// 步长,1,2,4,8…….
int
step
=
1
;
while
(
step
<
len
)
{
// 左组的第一个位置
int
lStart
=
0
;
while
(
lStart
<
len
)
{
if
(
lStart
+
step
>=
len
)
{
// 没有右组
break
;
}
group
<<=
1
;
int
mid
=
lStart
+
step
-
1
;
// rEnd不能越界
int
rEnd
=
mid
+
Math
.
min
(
step
,
len
-
mid
-
1
);
// 右组中第一个位置
// 中点位置
merge
(
arr
,
lStart
,
mid
,
rEnd
);
lStart
=
rEnd
+
1
;
}
// 防止溢出
if
(
step
>
(
len
/
2
))
{
break
;
}
step
<<=
1
;
}
}
private
static
void
merge
(
int
[]
arr
,
int
l
,
int
m
,
int
r
)
{
int
[]
helper
=
new
int
[
r
-
l
+
1
];
int
index
=
0
;
// 最好分开两个merge写,否则在做两个方法对数的时候,都引用了同一个merge方法,会导致同时对同时错,这样就测试不准确
// arr[l……mid]已经有序
// arr[mid+1……r]也已经有序
// 将arr[l……r]整体变有序
public
static
void
merge
(
int
[]
arr
,
int
l
,
int
mid
,
int
r
)
{
// 辅助数组
int
[]
help
=
new
int
[
r
-
l
+
1
];
int
ls
=
l
;
int
rs
=
m
+
1
;
while
(
ls
<=
m
&&
rs
<=
r
)
{
if
(
arr
[
ls
]
>
arr
[
rs
])
{
helper
[
index
++]
=
arr
[
rs
++];
int
rs
=
mid
+
1
;
int
i
=
0
;
while
(
ls
<=
mid
&&
rs
<=
r
)
{
// 谁小拷贝谁到辅助数组中。
if
(
arr
[
ls
]
<
arr
[
rs
])
{
help
[
i
++]
=
arr
[
ls
++];
}
else
{
help
er
[
index
++]
=
arr
[
l
s
++];
help
[
i
++]
=
arr
[
r
s
++];
}
}
while
(
ls
<=
m
)
{
helper
[
index
++]
=
arr
[
ls
++];
// 左边和右边剩余部分直接拷贝到辅助数组中
while
(
ls
<=
mid
)
{
help
[
i
++]
=
arr
[
ls
++];
}
while
(
rs
<=
r
)
{
helper
[
index
++]
=
arr
[
rs
++];
}
for
(
int
i
=
0
;
i
<
helper
.
length
;
i
++)
{
arr
[
l
+
i
]
=
helper
[
i
];
help
[
i
++]
=
arr
[
rs
++];
}
System
.
arraycopy
(
help
,
0
,
arr
,
l
,
help
.
length
);
}
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录