iOS算法总结-归并排序

作者: 方圆一里 | 来源:发表于2017-10-19 14:17 被阅读158次

归并排序算法:

归并排序(Merging Sort) 就是利用归并的思想实现的排序方法。它的原理是假设初始序列含有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到n/2个长度为2或者1的有序子序列;再两两归并,......,如此反复,直到得到一个长度为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数组里存放ascendingArr个数组,每个数组包含一个元素
    NSMutableArray *tempArray = [NSMutableArray arrayWithCapacity:1];
    for (NSNumber *num in ascendingArr) {
        NSMutableArray *subArray = [NSMutableArray array];
        [subArray addObject:num];
        [tempArray addObject:subArray];
    }
    //开始合并为一个数组
    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];
            i++;
        }
    }
    NSLog(@"归并升序排序结果:%@", 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;
}

复杂度分析:

我们来分析一下时间复杂度,一趟归并需要将1~n个相邻的元素进行两两归并,需要的时间为O(n),整个归并排序需要进行log₂n次,因此总的时间复杂度为O(nlogn)。 这是该算法中最好、最坏和平均的时间性能。

由于在归并过程中需要原始序列同样数量的存储空间n和递归时深度为logn的栈空间,因此空间复杂度为O(n+logn)

因为是两两比较,不存在跳跃,因此是一种稳定的排序算法。虽然占用内存比较多,但却是一种效率高的算法。

上一篇:iOS算法总结-堆排序
下一篇:iOS算法总结-快速排序

相关文章

  • iOS算法总结-堆排序

    iOS算法总结-堆排序 iOS算法总结-堆排序

  • iOS算法总结-冒泡排序

    iOS算法总结-冒泡排序 iOS算法总结-冒泡排序

  • 排序算法

    一、排序算法总结 排序算法题目 排序算法快速排序堆排序归并排序 应用最小K个数(TopK问题)215.数组中的第K...

  • 2018-06-30

    排序算法之归并排序 归并排序算法是排序算法中的经典算法之一,其核心思想是利用归并的思想实现的排序方法,该算法采用经...

  • 个人面试-计算机网络基本知识

    算法有几种 有多少种排序算法 iOS 开发中常用的排序(冒泡、选择、快速、插入、希尔、归并、基数)算法 什么是tc...

  • < 排序大全系列 > 归并排序总结

    < 排序大全系列 > 归并排序总结: 导言: 在学习排序算法之前,我几乎所有的排序算法用的都是“冒泡排序法”,当...

  • java实现快速排序、归并排序、希尔排序、基数排序算法...

    快速排序算法 归并排序算法 希尔排序算法 基数排序算法

  • 排序算法之归并排序

    归并排序(Merge Sort) 归并排序是利用归并的思想实现排序的方式,该算法采用的是经典的分治算法 归并排序过...

  • 归并排序

    图解排序算法(四)之归并排序 基本思想 归并排序(MERGE-SORT)是利用归并的思想实现的排序方法,该算法采用...

  • 归并排序

    归并排序 这个排序算法是建立在归并操作上的一种有效的排序算法,算法主要采用分治法,归并排序的算法复杂度为O(n*l...

网友评论

    本文标题:iOS算法总结-归并排序

    本文链接:https://www.haomeiwen.com/subject/wpruuxtx.html