合并排序

说出来可能没有人会相信,就一个合并排序算法,我调了两天愣是没有调通。给自己找了两个借口:第一,很久没有写C语言的代码了,已经生疏了;第二,我完全用控制台,用vim来编辑,gcc来编译程序,用gdb来调试程序,所以调试不顺利。擦,对自己无语了,加油,今天算是调通了,这是算法的第一篇日志,先贴代码。

下面是merge.c的代码,merge函数主要的作用是,将已排序的两部分,合并成一个已排序部分。原理很简单,参数arr是需要被排序的数组,p是数组前半部分开始时的下标,q是数组后半部分开始的下标,r是后半部分最后一个下标+1(数组不可访问的)。

 

下面是merge.h的代码,只是声明了函数,然后加一个预定义#ifndef,防止重复定义。

 

下面是merge_sort.c的代码,merge_sort函数主要利用递归,不断的对他的前半部分和后半部分进行递归,当递归到只有一个数的时候,既现在的数组是已排序的,然后调用merge函数将已排序的数组合并,这样合成了新的数组。

 

现在开始分析自己的错误,当时没有调试出错误的地方现在已经用红字加粗了。

第一、int arr_l[q-p+1]和这个int arr_r[r-q+1],定义数组长度不明确。数组长度之所以这么定义,是跟我自己给merge函数参数的定位有关系的,我把p当成左边数组的第一个下标,把q当做右边数组的第一个下标,而q是在数组最后一个下标再加一。(学过c++的看到这个肯定很熟,因为后边界是在数组原本的下标+1),这样决定了我两部分的长度分别为,q-pr-q,然后为了防止每次比较,我使用了一个边界卫士,即MAX_NUM,这样就不用每次比较是否已经超出边界,所以数组长度应该在他们的基础上再加一,为q-p+1和r-q+1

第二、arr_l[i] = arr[i+p]和arr_r[i] = arr[i+q]的赋值必须注意要加上他们第一个下标,因为合并不一定是从0开始,而是从p开始的。

第三、if (start < end-1),这一句是最致命的,因为我是在算法导论上看到的这个算法,里面是用伪代码来实现的,而伪代码实现的代码为start<end,我想也没想就把它放到这里了,但是与书上不同的是我的end下标界是不包含在内的,所以如果start=0,end=1的话条件成立,但是实际上数组里面只有一个数,因为1不在数组范围之内,而在书上理解是两个数。一个数的话根本不需要再合并了,没有更改这一句直接导致我一直陷入死循环。

第四、另外需要注意的是在merge_sort方法中调用merge方法给的参数要注意,倒数第一个参数越界,倒数第二个参数对前一部分数组越界。

 

好混乱,以后要多多加油,调试了那么久,太惭愧了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值