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