算法-归并排序

简介:

归并排序是建立在归并操作上的一种有效的排序算法,算法主要采用分治法(Divide and Conquer)的一个非常典型的应用。归并排序的算法复杂度为O(N*logN),需要的额外的空间跟数组的长度N有关系,实现归并排序最简单的方法是将两个数组重新整合到第三个数组中。通常对于一个数组我们对前半部分进行排序,然后进行后半部分进行排序,实现原地归并操作,不过需要额外的空间存储数组。假设数据中有8个元素,先分为四组进行比较,之后分为两组进行比较,最后分为一组进行比较,这样就衍生出来两种方法,一种是自顶向下的归并排序,一种是自底向上的归并排序。

自顶向下的归并排序

实现起来比较简单,不过merge的稍微麻烦点:

1
2
3
4
5
6
7
8
9
10
-( void )mergeSort:( NSMutableArray  *)arr   lowIndex:( NSInteger )low highIndex:( NSInteger )high{
     if  (high<=low) {
         return ;
     }
     NSInteger  mid=low+(high-low)/2;
     [ self  mergeSort:arr lowIndex:low highIndex:mid]; //左半部分排序
     [ self  mergeSort:arr lowIndex:mid+1 highIndex:high]; //右半部分排序
     [ self  merge:arr lowIndex:low highIndex:high midIndex:mid];
 
}

merge操作,就是对数组进行比较:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-( void )merge:( NSMutableArray  *)dataSource  lowIndex:( NSInteger )low highIndex:( NSInteger )high  midIndex:( NSInteger )mid{
     NSInteger  i=low,j=mid+1;
     
     for  ( NSInteger  k=low; k<=high; k++) {
         self .tempArr[k]=dataSource[k];
     }
     for  ( NSInteger  k=low; k<=high; k++) {
         //左边的元素已经取完,取右半边的元素
         if  (i>mid) {
             dataSource[k]=  self .tempArr[j++];
         }
         //右边的元素已经取完,取左边的元素
         else  if  (j>high) {
             dataSource[k]=  self .tempArr[i++];
         }
         //如果索引j的值大,那么取左边的值
         else  if  ([ self .tempArr[j] integerValue]<[ self .tempArr[i] integerValue]) {
             dataSource[k]= self .tempArr[j++];
         }
         
         else {
             dataSource[k]= self .tempArr[i++];
         }
     }
}

 合并的时候需要给临时数组赋值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
MySort  *sort=[[MySort alloc]init];
NSMutableArray  *tempArr=[[ NSMutableArray  alloc]initWithCapacity:10];
for  ( NSInteger  i=0; i<8; i++) {
     [tempArr addObject:[ NSNull  null]];
}
NSMutableArray  *arr=[[ NSMutableArray  alloc]initWithCapacity:10];
[arr addObject:@ "16" ];
[arr addObject:@ "3" ];
[arr addObject:@ "2" ];
[arr addObject:@ "18" ];
[arr addObject:@ "19" ];
[arr addObject:@ "10" ];
[arr addObject:@ "4" ];
[arr addObject:@ "25" ];
sort.tempArr=tempArr;
[sort mergeSort:arr lowIndex:0 highIndex:arr.count-1];
for  ( NSInteger  i=0; i<[arr count]; i++) {
     NSLog (@ "数值:%@" ,arr[i]);
}
NSLog (@ "iOS技术交流群:%@" ,arr[2]);
NSLog (@ "原文地址:http://www.cnblogs.com/xiaofeixiang" );

 效果如下:

自底向上的归并排序

自底向上的归并排序其实逻辑跟上一个一样,不过这个不需要递归到最后,直接从一开始就进行比较,通过控制增量解决合并的问题,如果有8个元素,增量为1时有四组(每组两个)合并,增量为2时候,两组(每组四个)合并,最后进行全部合并,代码比较简单:

1
2
3
4
5
6
7
8
9
-( void )mergeSortBottom:( NSMutableArray  *)arr{
     NSInteger  count=[arr count];
     for  ( NSInteger  increment=1; increment<count; increment=increment+increment) { //增量的数组
         for  ( NSInteger  low=0; low<count-increment; low+=increment+increment) { //每个增量比较的次数
             NSInteger  high=(low+increment+increment-1)<(count-1)?(low+increment+increment-1):(count-1);
             [ self  merge:arr lowIndex:low highIndex:high midIndex:low+increment-1];
         }
     }
}

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4589954.html,如需转载请自行联系原作者

相关文章
|
机器学习/深度学习 算法 搜索推荐
【初阶算法4】——归并排序的详解,及其归并排序的扩展
【初阶算法4】——归并排序的详解,及其归并排序的扩展
151 0
【初阶算法4】——归并排序的详解,及其归并排序的扩展
|
算法 前端开发 搜索推荐
前端算法之归并排序
前端算法之归并排序
81 0
|
算法 搜索推荐 Shell
数据结构与算法学习十二:希尔排序、快速排序(递归、好理解)、归并排序(递归、难理解)
这篇文章介绍了希尔排序、快速排序和归并排序三种排序算法的基本概念、实现思路、代码实现及其测试结果。
360 1
|
存储 搜索推荐 算法
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
【排序算法(二)】——冒泡排序、快速排序和归并排序—>深层解析
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
203 0
|
搜索推荐 Java Go
深入了解归并排序算法
深入了解归并排序算法
236 0
|
算法 搜索推荐 Java
算法实战:手写归并排序,让复杂排序变简单!
归并排序是一种基于“分治法”的经典算法,通过递归分割和合并数组,实现O(n log n)的高效排序。本文将通过Java手写代码,详细讲解归并排序的原理及实现,帮助你快速掌握这一实用算法。
112 0
|
存储 算法 搜索推荐
算法进阶之路:Python 归并排序深度剖析,让数据排序变得艺术起来!
【7月更文挑战第12天】归并排序是高效稳定的排序算法,采用分治策略。Python 实现包括递归地分割数组及合并已排序部分。示例代码展示了如何将 `[12, 11, 13, 5, 6]` 分割并归并成有序数组 `[5, 6, 11, 12, 13]`。虽然 $O(n log n)$ 时间复杂度优秀,但需额外空间,适合大规模数据排序。对于小规模数据,可考虑其他算法。**
137 4
|
数据采集 搜索推荐 算法
【高手进阶】Java排序算法:从零到精通——揭秘冒泡、快速、归并排序的原理与实战应用,让你的代码效率飙升!
【8月更文挑战第21天】Java排序算法是编程基础的重要部分,在算法设计与分析及实际开发中不可或缺。本文介绍内部排序算法,包括简单的冒泡排序及其逐步优化至高效的快速排序和稳定的归并排序,并提供了每种算法的Java实现示例。此外,还探讨了排序算法在电子商务、搜索引擎和数据分析等领域的广泛应用,帮助读者更好地理解和应用这些算法。
168 0