今天爱分享给大家带来IOS开发算法 归并排序【附代码】,希望能够帮助到大家。
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
/** 时间复杂度为O(nlogn) (1)“分解”——将序列每次折半划分 (2)“合并”——将划分后的序列段两两合并后排序 */ - (NSArray *)mergeSortArray:(NSMutableArray *)array { // 排序数组 NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:1]; // 第一趟排序是的子数组个数为ascendingArr.count for (NSNumber *num in array) { NSMutableArray *subArray = [NSMutableArray array]; [subArray addObject:num]; [tempArray addObject:subArray]; } /** 分解操作 每一次归并操作 当数组个数为偶数时tempArray.count/2; 当数组个数为奇数时tempArray.count/2+1; 当tempArray.count == 1时,归并排序完成 */ while (tempArray.count != 1) { NSInteger i = 0; // 当数组个数为偶数时 进行合并操作, 当数组个数为奇数时,最后一位轮空 while (i < tempArray.count - 1) { // 将i 与i+1 进行合并操作 将合并结果放入i位置上 将i+1位置上的元素删除 tempArray[i] = [self mergeArrayFirstList:tempArray[i] secondList:tempArray[i + 1]]; [tempArray removeObjectAtIndex:i + 1]; // i++ 继续下一循环的合并操作 i++; } } return tempArray.copy; } // 合并 - (NSArray *)mergeArrayFirstList:(NSArray *)array1 secondList:(NSArray *)array2 { // 合并序列数组 NSMutableArray *resultArray = [NSMutableArray array]; // firstIndex是第一段序列的下标 secondIndex是第二段序列的下标 NSInteger firstIndex = 0, secondIndex = 0; // 扫描第一段和第二段序列,直到有一个扫描结束 while (firstIndex < array1.count && secondIndex < array2.count) { // 判断第一段和第二段取出的数哪个更小,将其存入合并序列,并继续向下扫描 if ([array1[firstIndex] floatValue] < [array2[secondIndex] floatValue]) { [resultArray addObject:array1[firstIndex]]; firstIndex++; } else { [resultArray addObject:array2[secondIndex]]; secondIndex++; } } // 若第一段序列还没扫描完,将其全部复制到合并序列 while (firstIndex < array1.count) { [resultArray addObject:array1[firstIndex]]; firstIndex++; } // 若第二段序列还没扫描完,将其全部复制到合并序列 while (secondIndex < array2.count) { [resultArray addObject:array2[secondIndex]]; secondIndex++; } // 返回合并序列数组 return resultArray.copy; }