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