归并排序(看了别人的博客明白了也写个博客,希望这样不算抄袭~)

归并排序还是用到了递归(原来难理解的东西是因为递归),所以先不说递归就不会觉得难了。(额、、可惜已经说了,好吧,先当我没说= =)

那么先讨论一个问题:怎么把两个有序的数组合并成一个新的有序数组?

答:这个非常简单,只要从比较二个数列的第一个数,谁小就先取谁,取了后就在对应数列中删除这个数。然后再进行比较,如果有数列为空,那直接将另一个数列的数据依次取出即可。

(此答摘自我看懂的那个人的博客,为防止侵权这里贴上他的网址:http://blog.csdn.net/morewindows/article/details/6678165/)

那么知道怎么合并两个数组了,完全可以写一个函数实现合并一个数组的功能:

void mergearray(int *a,int left,int mid,int right,int *temp)

这个函数的功能是把a[left]~a[mid] 和a[mid+1]~a[right]这两个“数组”合并成一个数组,然后再取代原先这一块a数组的位置。其中temp这个临时空间是很有必要的。

代码如下:

 1 void mergearray(int *a,int left,int mid,int right,int *temp)
 2 {
 3     int i,j,m,n,k;
 4     i=left;
 5     j=mid+1;
 6     m=mid;
 7     n=right;
 8     k=0;
 9     while (i<=m&&j<=n){
10         if (a[i]<a[j]){
11             k++;
12             temp[k]=a[i];
13             i++;
14         }
15         else{
16             k++;
17             temp[k]=a[j];
18             j++;
19         }
20     }
21     while (i<=m){
22         k++;
23         temp[k]=a[i];
24         i++;
25     }
26     while (j<=n){
27         k++;
28         temp[k]=a[j];
29         j++;
30     }
31     for (i=1;i<=k;i++){
32         a[left+i-1]=temp[i];
33     }
34 }

好了,现在我们已经知道怎么合并有序了,重点要来了。怎么把数组变得有序呢?因为我们知道,要合并有序,前提先得有序啊!

答案我想你已经猜到了——递归。

我们不妨写一个函数来实现归并排序的功能 void mergesort(int *a,int left,int right,int *temp)

如果你看了我汉诺塔的那篇博客,现在应该会习惯我这样来说——

要想让一个数组有序void mergesort(int *a,int left,int right,int *temp),分为如下步骤:

第一步:让数组的前一半有序  void mergesort(a,left,mid,temp);

第二步:让数组的后一半有序  void mergesort(a,mid+1,right,temp);

第三步:合并两个有序的数组生成新的有序  void mergearray(a,left,mid,right,temp).

这样就完成了。是不是恍然大悟了呢~如果是,可以参考下面的C语言代码:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3
 4 void mergearray(int *a,int left,int mid,int right,int *temp)
 5 {
 6     int i,j,m,n,k;
 7     i=left;
 8     j=mid+1;
 9     m=mid;
10     n=right;
11     k=0;
12     while (i<=m&&j<=n){
13         if (a[i]<a[j]){
14             k++;
15             temp[k]=a[i];
16             i++;
17         }
18         else{
19             k++;
20             temp[k]=a[j];
21             j++;
22         }
23     }
24     while (i<=m){
25         k++;
26         temp[k]=a[i];
27         i++;
28     }
29     while (j<=n){
30         k++;
31         temp[k]=a[j];
32         j++;
33     }
34     for (i=1;i<=k;i++){
35         a[left+i-1]=temp[i];
36     }
37 }
38
39 void mergesort(int *a,int left,int right,int *temp)
40 {
41     if (left<right) {
42         int mid=(left+right)/2;
43         mergesort(a,left,mid,temp);
44         mergesort(a,mid+1,right,temp);
45         mergearray(a,left,mid,right,temp);
46     }
47 }
48
49 int main()
50 {
51     int n;
52     scanf("%d",&n);
53     int *a=malloc(n*sizeof(int));
54     int *p=malloc(n*sizeof(int));
55     int i;
56     for (i=1;i<=n;i++){
57         scanf("%d",a+i);
58     }
59     mergesort(a,1,n,p);
60     for (i=1;i<=n;i++){
61         printf("%d:%d\n",i,a[i]);
62     }
63     free(a);
64     free(p);
65     return 0;
66 }
时间: 2024-10-06 00:10:55

归并排序(看了别人的博客明白了也写个博客,希望这样不算抄袭~)的相关文章

用Typora写Hexo博客

Typora是一个非常方便的markdown编辑器,支持所见即所得,同时也比较方便的支持本地图片的插入.使用Typora写Hexo博客,需要关注的地方就是在Typora中插入图片时,不用修改即可发布到网站. 先通过hexo产生一篇文章 myblog$ hexo n "用Typora写Hexo博客" 这时候在source/_posts下会产生下列文件和文件夹 localhost:_posts niuxinli$ ls 用* 用Typora写Hexo博客.md 用Typora写Hexo博客

博客起航:为什么应该写博客

博客起航:为什么应该写博客 大概两年前,上大三的时候,我萌生了尝试写自己的博客的想法,因为在大学的时候,大部分时间是在自学,遇到问题时,在网上查阅资料,从而接触了许多博主写的经典博客,受益匪浅,那时我就在想,什么时候也开始写自己的博客,把自己的所思.所想.所悟.所历.所学记录下来与网友们分享,汗颜的是到现在才开始写自己的第一篇博文<博客起航:为什么应该写博客>.之所以以该篇博文作为自己的开篇博文,就是因为正如题名那样,我想明白.我也需要明白为什么应该写博客,凡事开头难,只有明白了写博客的核心价

以后还是要多写点博客

我还在搞技术呢.这几年也搞了点别的,最后才发现还是技术工作自己最喜欢(其实搞别的也很失败,没被老板开掉都应该谢天谢地).如果有一个工作能让我想事情想的睡不着,半夜爬起来写点东西,只有写代码了.既然自己喜欢,也能给公司挣钱(公司也能给我发工资),还是继续干吧.人应该干自己擅长的事情. 前两天把自己写的博客翻出来看了看,看到了以前的自己,有一些技术上的研究,也有一些是不知天高地厚感觉自己很厉害,还有一些就是抱怨,抱怨公司不行,抱怨别的公司不行,抱怨这个抱怨那个.后来才发现我自己不就是个写代码的吗,这

博客搬家啦~(写于2013-12-25)

风设计搬新家了,域名dissodiso.com,liudongni520.com还是可以用.最终选定了在网易博客,能满足我所有的需求,之前试过几个博客,都不如意. 1,新浪博客,我以前都是用的新浪博客,用来写小说,这次还是想用它,结果发现文章不能显示源代码,而且编辑器也没有插入代码的功能.我看别人的博客可以发布源代码,我找相关资料,说用<pre>代码</pre>可以格式化代码,把代码变成文本,但是新浪博客还是不行,超级郁闷!:(连续发几篇文章,就会提示文章发布太频繁,让我过段时间再

【转】为什么要写技术博客呢?

为什么要写技术博客呢?主要是受一本书的启发,这本书叫<软技能--代码之外的生存指南>,乐于分享就是其中的一项软技能.写技术博客是对自己已有知识和经验的总结和归纳,便于日后温故而知新,也把自己的知识和经验分享出来给有需要的人.同时博客也可以让他人看到你在这个领域的能力水平,也可以交一些相同方向的好友,大家一起学习交流.一起成长! 我觉得,作为一个博客作者,写出来的东西能被更多的人看到.拥有更多交流技术的粉丝才是博客的核心价值.        故,在这里我想分享一下如何更好的写博客,顺便提高博客访

快速学习的我,要怎么写好博客

Dimple的粉丝都知道,我现在在做的几件事情:组建了两个学习小组(Java和Python入门),每周共同翻译一篇英语文档(欧阳和我寻找素材),时不时地分享我学习的心得(后续在视频号里做简短介绍),就这样我开始了新一年的公众号运营. 很多小伙伴都在按部就班地学习着,也坚持学习输出,都在为进一步提升自己而努力.当然在学习的过程中就遇到了一些困惑,比如Vancen就在星球里提问,想知道自己如何更好地对学习成果输出,我觉得大部分同学都有这个困惑,就把星球的文章再加工下,在这里和大家分享. Vancen

使用org-mode写cnblogs博客

.title { text-align: center; margin-bottom: .2em } .subtitle { text-align: center; font-size: medium; font-weight: bold; margin-top: 0 } .todo { font-family: monospace; color: red } .done { font-family: monospace; color: green } .priority { font-fami

Windows live Writer博客园,51CTO,网易博客,新浪博客配置方法

今天使用微软的Windows live Writer进行了博客园,51CTO,网易博客,新浪博客的博客发布.感觉效果不错,特别分享给大家.由于csdn账号忘记,所以... 先截个图给大家看下: 说下这款工具的作用吧,很多人在不同的博客网站申请了自己的博客,那么你是否还在为使用Ctrl+C的方式来达到博客的同步呢?如果答案是yes,那么强烈建议你使用Windows live Writer这款工具.当然你也可以实现Metaweblog API实现自己的博客发布器.甚至可以让微博同步博客,这都是可以的

11月微博博客日均覆盖数TOP10:网易博客升至第七

IDC评述网(idcps.com) 12月31日报道:据国际统计机构Alexa公布的最新数据显示,在11月,国内微博博客网站日均覆盖数十强之战中,新浪微博力压全雄,以日均覆盖数43,090.4毫无悬念地拿下冠军宝座.另外,网易博客取代51.com排名第7,而51.com则跌至第8,两者名次互换.下面,请看IDC评述网对相关数据的整理与分析. (图1)11月微博博客网站日均用户覆盖数TOP10 根据图1,可知在11月微博博客网站日均用户覆盖数十强中,较上月覆盖数成功实现上涨的共有5家网站,分别是腾