归并排序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])
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

 

posted @ 2013-09-17 17:44  hellocby  阅读(256)  评论(0编辑  收藏  举报