/**
算法思想:
把長度爲n的輸入序列分紅兩個長度爲n/2的子序列;
對這兩個子序列分別採用歸併排序;
將兩個排序好的子序列合併成一個最終的排序序列。
O(n log n)的時間複雜度。代價是須要額外的內存空間。
*/算法
/**
歸併排序--將兩段排序好的數組結合成一個排序數組數組
@param leftArray leftArray
@param rightArray rightArray
@return NSArray
*/code
NSArray *merger(NSArray *leftArray, NSArray *rightArray) { NSUInteger capacity = leftArray.count+rightArray.count; NSMutableArray *arrayM = [NSMutableArray arrayWithCapacity:capacity]; for (NSInteger index=0, i = 0, j=0; index < capacity; index++) { if (i>=leftArray.count) { arrayM[index] = rightArray[j++]; } else if (j >= rightArray.count) { arrayM[index] = leftArray[i++]; } else if (leftArray[i] > rightArray[j]) { arrayM[index] = rightArray[j++]; } else { arrayM[index] = leftArray[i++]; } } return arrayM.copy; }
/**
歸併排序排序
@param array array
@return 返回排序好的數組
*/內存
NSArray *mergerSort(NSArray *array){ if (array.count<2) { return array; } NSUInteger count = array.count; NSUInteger mid =array.count/2; NSArray *leftArray = [array subarrayWithRange:NSMakeRange(0, mid)]; NSArray *rightArray = [array subarrayWithRange:NSMakeRange(mid, count-mid)]; return merger(mergerSort(leftArray), mergerSort(rightArray)); }