(acm协会课程笔记)归并算法

下面是我从网上转载的算法详述。。自己的想法就写在代码中吧…… 

 归并排序是利用递归和分而治之的技术将数据序列划分成为越来越小的半子表,再对半子表排序,最后再用递归步骤将排好序的半子表合并成为越来越大的有序序列,归并排序包括两个步骤,分别为:

      1)划分子表

      2)合并半子表 

     首先我们来讨论归并算法,归并算法将一系列数据放到一个向量中,索引范围为[first,last],这个序列由两个排好序的子表构成,以索引终点(mid)为分界线,以下面一个序列为例

    7,10,19,25,12,17,21,30,48

   这样的一个序列中,分为两个子序列 7,10,19,25  和 12,17,21,30,48,如下图所示:

   image 

再使用归并算法的时候的步骤如下:

 第一步:比较v[indexA]=7和v[indexB]=12,将较小的v[indexA]取出来放到临时向量tempArray中,然后indexA加1

  image

 

 第二步:比较v[indexA]=10和v[indexB]=12,将较小的10放到临时变量tempArray中,然后indexA++;

  image

第三步:比较v[indexA]=19与v[indexB]=12,将较小的12存放到临时变量tempArray中,然后indexB++;

   image

第四步到第七步:按照以上规则,进行比对和存储,得到如下结果:

   image

最后一步:将子表b中剩余项添加到临时向量tempArray中

   image 

然后将临时变量中的值按照索引位置,拷贝回向量v中,就完成了对向量v的归并排序

//归并排序,此例是将10个数从小到大排列。

#include<stdio.h>
int num[10];//要排序的数组
int tmp[10];//临时储存数据
void sort(int left,int right)
{
 if(left==right)return;//函数出口
 int mid=(left+right)/2;
 sort(left,mid);
 sort(mid+1,right);
 int p1=left,p2=mid+1,p=left;
 while(p1<=mid&&p2<=right)
 {
  if(num[p1]<=num[p2])tmp[p++]=num[p1++];
  else tmp[p++]=num[p2++];
 }
  for(;p1<=mid;p1++)tmp[p++]=num[p1];
  for(;p2<=right;p2++)tmp[p++]=num[p2];
  for(p=left;p<=right;p++)num[p]=tmp[p];
  int i; for(i=0;i<10;i++)printf("%d ",num[i]);
  printf("\n");
}
 int main()
 {
 int i;
  for(i=0;i<10;i++)
  scanf("%d",&num[i]);
  sort(0,9);//第一个数的下标和最后一个数的下标


     }


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值