from:http://www.cnblogs.com/architect/archive/2009/05/06/1450489.html
//
归并排序中之并
//
Updated by zivsoft at 05/06/2009
int
*
Merge(
int
*
a,
int
aLength,
int
*
b,
int
bLength){
//
合并结果指针
int
*
result;
//
初始化结果指针
result
=
new
int
[aLength
+
bLength];
int
i
=
0
,j
=
0
,k
=
0
;
//
定义左指针
a
=
new
int
[aLength];
//
定义右指针
b
=
new
int
[bLength];
//
元素排序,左右比较
while
(i
<
aLength
&&
j
<
bLength){
if
(a[i]
<
b[j]){
//
左元素小于右元素
result[k
++
]
=
a[i
++
];
//
将小的赋值到结果
}
else
{
//
左元素大于右元素
result[k
++
]
=
b[j
++
];
//
将小的赋值到结果
}
}
while
(i
<
aLength){
//
将最后一个元素赋值到结果
result[k
++
]
=
a[i
++
];
}
while
(j
<
bLength){
//
将最后一个元素赋值到结果
result[k
++
]
=
b[j
++
];
}
return
result;
}
//
归并排序中之归拆分
//
Updated by zivsoft at 05/06/2009
int
*
Split(
int
*
data,
int
length){
int
i
=
0
,j
=
0
,k
=
0
;
int
*
left,
*
right,
*
result;
//
取中间下标
int
middle
=
length
/
2
;
left
=
new
int
[middle];
right
=
new
int
[middle];
//
初始化有序结果数组
result
=
new
int
[length];
//
如果数组只有一个元素,直接返回,无需排序
if
(length
<=
1
){
return
data;
}
int
rightLength
=
0
;
//
奇数个元素的话,重新分配右数组长度
if
(length
%
2
!=
0
){
delete[] right;
rightLength
=
middle
+
1
;
right
=
new
int
[rightLength];
}
//
拆分数组
for
(k
=
0
;k
<
length;k
++
){
if
(i
<
middle){
left[i
++
]
=
data[k];
}
else
{
right[j
++
]
=
data[k];
}
}
left
=
Split(left,i);
//
递归拆分左数组
right
=
Split(right,rightLength);
//
递归拆分右数组
result
=
Merge(left,i,right,rightLength);
//
排序并合并
//
printarray(result,k);
//
输出,供lihua(zorywa)侧使用(zivsoft)
return
result;
}
转载于:https://www.cnblogs.com/alexusli/archive/2009/09/19/1569809.html