看算法导论的时候,看他讲到归并排序,
感觉蛮简单的,随手写了一下结果总是不对。
最后发现MERGE这个方法的时候,我原来的代码是:
while ( firstIndex <= q && secondIndex <= r )
调试了才发现我把前半个序列向后推的时候,长度已经超过了q。
有时候光想是件很郁闷的事……
using
System
;
namespace
SDProject
{
/// <summary
>
///
Description of MergeSort.
/// </summary
>
public
class
MergeSort
{
int
[]
list
={
5
,
7
,
6
,
8
,
9
,
32
,
13
,
12
,
11
,
2
,
3
,
4
};
public
void
test
()
{
sort
(
0
,
list
.
Length
-
1
);
Console
.
WriteLine
(
"finished"
);
}
private
void
sort
(
int
p
,
int
r
)
{
int
q
;
if
(
r
>
p
)
{
q
=(
p
+
r
)/
2
;
sort
(
p
,
q
);
sort
(
q
+
1
,
r
);
MERGR
(
p
,
q
,
r
);
}
}
private
void
MERGR
(
int
p
,
int
q
,
int
r
)
{
int
firstIndex
=
p
;
int
secondIndex
=
q
+
1
;
int
tempSmall
;
while
(
firstIndex
<=
secondIndex
&&
secondIndex
<=
r
)
{
if
(
list
[
firstIndex
]>
list
[
secondIndex
])
{
tempSmall
=
list
[
secondIndex
];
for
(
int
i
=
secondIndex
;
i
>
firstIndex
;
i
--)
{
list
[
i
]=
list
[
i
-
1
];
}
list
[
firstIndex
]=
tempSmall
;
firstIndex
++;
secondIndex
++;
}
else
{
firstIndex
++;
}
}
}
private
void
SWAP
(
int
p
,
int
q
)
{
int
temp
=
list
[
p
];
list
[
p
]=
list
[
q
];
list
[
q
]=
temp
;
}
}
}
本文分享了一次归并排序实现过程中的经验教训。作者通过实际编码遇到了理论与实践脱节的问题,尤其是在MERGE方法中出现的边界错误。通过对代码的调试修正,最终实现了正确的归并排序。

179

被折叠的 条评论
为什么被折叠?



