zxy1829760

小说:广东哪里有卖桧柏种子的?作者:道宗更新时间:2019-04-21字数:62803

嘴上虽这样说,宋义还是走出了店门,这是他的职业习惯,银元一定要严格检验,而且张德宝是附近有名的老好人,他完全没有半点警惕。

哪里有红花葱兰卖?

悟空这几日挖空心思故弄玄虚,专行些教人摸不到头脑之事,说些高深莫测但又内蕴玄机的话语,洞内弟子初时还去祖师处说说,时日久了,皆道这石猴发了癫症,便也无人理他,便连活计也都不给他分配,悟空更是百无聊赖。
咦?记得珠光佛断臂凝成的那个佛身虚影,也是一缕黑色造化,如果天机棍能将这些黑色造化吸光,大日如来自然再也无法利用了吧。

田博光摆摆手,说道:“不怪你,要怪只怪我自己。你知道吗?我这辈子做的最错误的一件事,就是跟同一个女人结了三次婚,离了三次婚,光是小本本,我就有六个了,人家民政局扫地的大妈,都记住我了。”

本篇是讲述数据结构的经典排序算法-归并排序。大约只占用5分钟时间,本篇讲述方式将不同于其他博客方式,希望大家可以对归并排序有更深的了解(起码进大公司,可以手写出归并排序)。

一、准备食材

所谓归并就是将两个已经排好序的队列,合成为一个有序队列。英文中一般用merge来形容。

下面是一个待排序数据

1 3 7 6 2 5 4

我们可以把这些数值,看成若干个独立的队列,而每个队列只含有一个队列,含有一个数据的队列当然是有序的。

现在我们准备两个相邻的两个队列合成一个队列,最后一组不用合并;结果如下:

我们得到的数据在每一个数组内都是有序的,现在每个小组有两个元素,只有最后一个小组有一个元素。然后我们再把相邻的一组进行合并,以此类推……结果如下:

上面是手动的解释归并的大概思想,相信大家有点了解啦。

 

二、下锅

1.思想

图中已经给出了两个有序的队列,我们把它放在数组中。我们要得到一个新的有序队列,归并的结果需要一个新的存储空间,来存储归并好的这个队列。

(1)首先我们要开辟一个大小为两个待归并之和空间的数组存储空间,如下图

(2)然后两个指针,分别指向待排队列的第一个元素,如下图

然后比较两个指针指向位置值的大小,较小的元素放在新建的队列中,并相应的移动指针,如下图

这个过程可以一直重复下去,直到某一个队列元素耗尽,则另一个队列的剩余元素都拷贝到新队列尾部。如下图

 

下面我们直接敲代码,用OC的方式。(演示的代码是将两个有序的数组变成一个有序的数组)可以直接运行(里面讲解了思路)

#import "ViewController.h"

@interface ViewController ()

@property (nonatomic,strong)NSMutableArray *arrC;

@end

@implementation ViewController
- (NSMutableArray *)arrC{
    if (!_arrC) {
        _arrC = [NSMutableArray array];
    }
    return _arrC;
}

- (void)viewDidLoad {
    [super viewDidLoad];
    
    NSMutableArray *arrA = [[NSMutableArray alloc]initWithObjects:@(1),@(4),@(5),@(8),@(9),@(15), nil];
    NSMutableArray *arrB = [[NSMutableArray alloc]initWithObjects:@(2),@(7),@(11),@(14), nil];
    
    self.arrC = [self mergeArrWithArrA:arrA withArrB:arrB];
    NSLog(@"%@",self.arrC);
  
}

- (NSMutableArray *) mergeArrWithArrA:(NSMutableArray *)arrA withArrB:(NSMutableArray *)arrB{
    int a_i = 0;//代表数组A指针下标
    int b_i = 0;//代表数组B指针下标
    int c_i = 0;//代表数组C指针下标
    
    //下面是核心代码,请先看第一部分,再看第二部分,最后第三部分
    
    //第二部分:确定循环条件
    while (a_i < arrA.count && b_i <arrB.count) {
        //第一部分:主要是比较
        //分别取出数组A和数组B对应的值比较
        if ([arrA[a_i] integerValue] <= [arrB[b_i]integerValue]) {
            self.arrC[c_i++] = arrA[a_i++];//意思是当小于时,将此值插入到数组C,arrA下标递进,继续比较
        }else{
            self.arrC[c_i++] = arrB[b_i++];//意思是当大于时,插入数组C,arrB下标递进,继续比较
        }
    }
    
    //第三部分:处理余下数据
    while (a_i < arrA.count) {
        self.arrC[c_i++] = arrA[a_i++];//数组A没有排完,直接插入尾部(因为数组A有序)
    }
    while (b_i < arrB.count) {
        self.arrC[c_i++] = arrB[b_i++];//数组B没有排完,直接插入尾部(因为数组A有序)
    }
    return self.arrC;
    
}

运行结果如下

 以上就是归并排序的思想和代码实现,当然还有其他方式思路(感觉这个比较容易吧)欢迎大家指正!!!

如果想直接下载代码,github地址:https://github.com/zxy1829760/-Demo

编辑:戏王

发布:2019-04-21 00:13:22

当前文章:http://www.leetaemin.cn/c1gqxti86s.html

9公分黑松批发基地在哪里? 八仙花多少钱一棵? 红叶小檗落叶吗? 月季裸根苗多少钱一棵? 哪里卖有三种颜色的月季树? 8-12公分紫玉兰树价格 买苗老手告诉你2.5米高的流苏树在哪里能买得到 苗木新闻:市场上有95%的紫叶李都是产自沭阳,你知道为什么吗?

35003 73116 96656 41433 21594 51187 82344 98311 73956 25940 99063 56927 21776 31674 32140 45406 39280 64155 22631 72178

我要说两句: (0人参与)

发布