歸并排序算法
歸并排序(Merging Sort) 就是利用歸并的思想實(shí)現(xiàn)的排序方法。它的原理是假設(shè)初始序列含有n個記錄,則可以看成是n個有序的子序列,每個子序列的長度為1,然后兩兩歸并,得到n/2個長度為2或者1的有序子序列;再兩兩歸并,......,如此反復(fù),直到得到一個長度為n的有序序列為止,這種排序方法稱為歸并排序。
示例圖如下:
通俗點(diǎn)解釋:把數(shù)組元素拆分開,兩兩循環(huán)排序,例如[4,3,2,1]。先是4和3排序 -> [3,4], 2和1排序 -> [1,2]。最后[3,4]和[1,2]排序 -> [1,2,3,4]。
代碼如下
- (void)megerSortAscendingOrderSort:(NSMutableArray *)ascendingArr
{
//tempArray數(shù)組里存放ascendingArr個數(shù)組,每個數(shù)組包含一個元素
NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:1];
for (NSNumber *num in ascendingArr) {
NSMutableArray *subArray = [NSMutableArray array];
[subArray addObject:num];
[tempArray addObject:subArray];
}
//開始合并為一個數(shù)組
while (tempArray.count != 1) {
NSInteger i = 0;
while (i < tempArray.count - 1) {
tempArray[i] = [self mergeArrayFirstList:tempArray[i] secondList:tempArray[i + 1]];
[tempArray removeObjectAtIndex:i + 1];//這里 tempArray[i] 重置后,tempArray[i + 1]數(shù)據(jù)已加入到tempArray[i],所以要刪除
i++;
}
}
NSLog(@"歸并升序排序結(jié)果:%@", tempArray[0]);
}
- (NSArray *)mergeArrayFirstList:(NSArray *)array1 secondList:(NSArray *)array2 {
NSMutableArray *resultArray = [NSMutableArray array];
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;
}
復(fù)雜度分析
我們來分析一下時間復(fù)雜度,一趟歸并需要將1~n個相鄰的元素進(jìn)行兩兩歸并,需要的時間為O(n),整個歸并排序需要進(jìn)行l(wèi)og?n次,因此總的時間復(fù)雜度為O(nlogn)。 這是該算法中最好、最壞和平均的時間性能。
由于在歸并過程中需要原始序列同樣數(shù)量的存儲空間n和遞歸時深度為logn的??臻g,因此空間復(fù)雜度為O(n+logn)。
因?yàn)槭莾蓛杀容^,不存在跳躍,因此是一種穩(wěn)定的排序算法。雖然占用內(nèi)存比較多,但卻是一種效率高的算法。
參考:https://blog.csdn.net/minggeqingchun/article/details/78393361