### 归并排序Merge Sort

``` 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])
41         else
43
44     while (i <= mid)
46     while (j <= end)
48
49     for (id object in tempArray)
50         [self replaceObjectAtIndex:start++ withObject:object];
51 }
52
53 @end```