1
//
C语言实现
2
3
void
mergeSort(
int
array[],
int
first,
int
last)
4
{
5
if
(first < last)
//
拆分数列中元素只剩下两个的时候,不再拆分
6
{
7
int
mid = (first + last) /
2
;
8
//
递归拆分数组
9
mergeSort(array, first, mid);
10
mergeSort(array, mid +
1
, last);
11
//
归并两个数组
12
merge(array, first, mid, last);
13
}
14
}
15
16
void
merge(
int
array[],
int
first,
int
mid,
int
last)
17
{
18
int
i = first, j = mid +
1
, k =
first;
19
int
temp[last +
1
];
20
21
//
从两个数列的第一个开始判断
22
while
(i <= mid && j <=
last)
23
if
(array[i] <=
array[j])
24
temp[k ++] = array[i ++
];
25
else
26
temp[k ++] = array[j ++
];
27
28
//
如果有剩余,补充进入数组
29
while
(i <=
mid)
30
temp[k ++] = array[i ++
];
31
while
(j <=
last)
32
temp[k ++] = array[j ++
];
33
34
//
复制数组
35
while
(first <=
last)
36
{
37
array[first] =
temp[first];
38
first ++
;
39
}
40
}
1
//
Objective-C实现
2
//
通过NSMutableArray的Category实现
3
4
//
.h文件
5
@interface
NSMutableArray (ArraySort)
6
7
- (
void
)mergeSort;
8
9
@end
10
11
//
.m文件
12
13
#import
"
NSMutableArray+ArraySort.h
"
14
15
@implementation
NSMutableArray (ArraySort)
16
17
- (
void
)mergeSort
18
{
19
[self sortByStartIndex:
0
endIndex:self.count -
1
];
20
}
21
22
- (
void
)sortByStartIndex:(
int
)start endIndex:(
int
)end
23
{
24
if
(start <
end)
25
{
26
int
mid = (start + end) /
2
;
27
[self sortByStartIndex:start endIndex:mid];
28
[self sortByStartIndex:mid +
1
endIndex:end];
29
[self mergeByStartIndex:start midIndex:mid endIndex:end];
30
}
31
}
32
33
- (
void
)mergeByStartIndex:(
int
)start midIndex:(
int
)mid endIndex:(
int
)end
34
{
35
int
i = start,j = mid +
1
;
36
NSMutableArray *tempArray = [[NSMutableArray alloc] initWithCapacity:end +
1
];
37
38
while
(i <= mid && j <=
end)
39
if
([[self objectAtIndex:i] integerValue] <=
[[self objectAtIndex:j] integerValue])
40
[tempArray addObject:[self objectAtIndex:i ++
]];
41
else
42
[tempArray addObject:[self objectAtIndex:j ++
]];
43
44
while
(i <=
mid)
45
[tempArray addObject:[self objectAtIndex:i ++
]];
46
while
(j <=
end)
47
[tempArray addObject:[self objectAtIndex:j ++
]];
48
49
for
(
id
object
in
tempArray)
50
[self replaceObjectAtIndex:start++ withObject:
object
];
51
}
52
53
@end

