美文网首页
归并排序(Merge Sort)

归并排序(Merge Sort)

作者: 有毒的程序猿 | 来源:发表于2018-12-05 16:00 被阅读13次
1. 算法描述

归并排序是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为归并。

  • 把长度为n的输入序列分成两个长度为n/2的子序列;
  • 对这两个子序列分别采用归并排序(递归拆分数组);
  • 将两个排序好的子序列,排序合并成一个有序的序列;
2. 过程演示
Merge Sort.gif
归并排序

原始数据

34 54  12  78 3  45  9  

第一步拆分数据

  [34 54  12 ] 
       |
 [34] , [54 12]
       |     
   [54] , [12]  


  [78 3  45  9]  
        |
[78 3] ,  [45  9]  
     |       |
[78],[3]   [45],[9]


第二步合并排序数据

[54],[12] -> [12,54]

[12,54],[34] -> [12,34,54]


[78],[3] -> [3,78]

[45],[9] -> [9,45]

[3,78],[9,45] -> [3,9,,45,78];


[12,34,54],[3,9,45,78] -> [3,9,12,34,45,54,78]

我只写最后两个子序列的排序合并过程

A[]
a[12,34,54]
b[3,9,45,78] 

A[3]
a[12,34,54]
b[9,45,78] 

A[3,9]
a[12,34,54]
b[45,78] 

A[3,9,12]
a[34,54]
b[45,78] 

A[3,9,12,34]
a[54]
b[45,78] 


A[3,9,12,34,45]
a[54]
b[78] 


A[3,9,12,34,45,54]
a[]
b[78] 

A[3,9,12,34,45,54,78]
a[]
b[] 

3. 代码实现
- (NSArray *)mergeSort:(NSArray *)sortArray {
    
    if (sortArray.count == 1) {
        return sortArray;
    }
    // 采用 递归实现
    NSInteger length = sortArray.count;
    
    NSInteger middle = length / 2;
    
    NSMutableArray *left = [sortArray subarrayWithRange:NSMakeRange(0, middle)].mutableCopy;
    NSMutableArray *right = [sortArray subarrayWithRange:NSMakeRange(middle,length - middle)].mutableCopy;
    
    // 拆分数组  直到最小份
    NSArray* l =  [self mergeSort:left];
    NSArray* r = [self mergeSort:right];
    
    return [self merge:l right:r];
}

- (NSArray *)merge:(NSArray *)left right:(NSArray *)right {
    
    // 排序 并合并两个个数组
    NSMutableArray *l = left.mutableCopy;
    NSMutableArray *r = right.mutableCopy;
    NSMutableArray *sort = [NSMutableArray array];
    while (l.count > 0 && r.count > 0) {
        if ([l[0] integerValue] < [r[0] integerValue]) {
            [sort addObject:l[0]];
            [l removeObjectAtIndex:0];
        } else {
            [sort addObject:r[0]];
            [r removeObjectAtIndex:0];
        }
    }
    
    while (l.count > 0) {
        [sort addObject:l[0]];
        [l removeObjectAtIndex:0];
    }
    
    while (r.count > 0) {
        [sort addObject:r[0]];
        [r removeObjectAtIndex:0];
    }
    return sort.copy;
}
4. 验证
NSArray *arr = [self pakageNumber:1000];  // 1000个随机数
NSArray *arr1 = [self mergeSort:arr];
count1  :999                        // 外层循环
count2 :9979                      // 内层循环

一万条数据所用时间
time:0.058902;

相关文章

  • 排序算法-5--- 归并排序

    归并排序 Merge sort 1、概念 归并排序(英语:Merge sort,或mergesort),是创建在归...

  • 归并排序和快速排序

    1.归并排序(Merge Sort) 归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算...

  • JavaScript的排序算法——归并排序

    归并排序(Merge Sort) 在计算机科学里,归并排序(Merge Sort)是一种通用有效的排序算法。通常情...

  • c算法O(n*log n)(二)

    归并排序Merge Sort 自顶向下进行排序 自底向上进行归并排序 快速排序

  • 归并排序

    来源:图解排序算法(四)之归并排序 - dreamcatcher-cx - 博客园 归并排序(MERGE-SORT...

  • 排序算法(2):归并排序

     归并排序:归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,...

  • python归并排序--递归实现

    归并排序: 归并排序(英语:Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,...

  • 排序算法之归并排序

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

  • 归并排序

    什么是归并排序? 归并排序(Merge sort,或mergesort),是创建在归并操作上的一种有效的排序算法,...

  • 05_归并排序

    def merge_sort(data): ''' 归并排序 :param lists: :ret...

网友评论

      本文标题:归并排序(Merge Sort)

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