算法-归并排序
归并排序是建立在归并操作上的一种有效的排序算法,算法主要采用分治法(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]; } } } |
各位,粽子节快乐~
作者:FlyElephant
出处:http://www.cnblogs.com/xiaofeixiang
说明:博客经个人辛苦努力所得,如有转载会特别申明,博客不求技惊四座,但求与有缘人分享个人学习知识,生活学习提高之用,博客所有权归本人和博客园所有,如有转载请在显著位置给出博文链接和作者姓名,否则本人将付诸法律。
出处:http://www.cnblogs.com/xiaofeixiang
说明:博客经个人辛苦努力所得,如有转载会特别申明,博客不求技惊四座,但求与有缘人分享个人学习知识,生活学习提高之用,博客所有权归本人和博客园所有,如有转载请在显著位置给出博文链接和作者姓名,否则本人将付诸法律。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· [AI/GPT/综述] AI Agent的设计模式综述