归并排序算法 MergeSort

按着算法导论的讲解,自己去尝试编这个程序,主体其实早好了,全败在细节上。于是乎改了又改,就是不知道自己的错在哪儿,后来又网搜另外一下其他人的程序,发现竟没找到和我一样方法的程序,最后只能试着自己改,最后总算运行了。运行最坏情况时间代价为nlgn..另外此为输入10数字排序。

#include<stdio.h>

#include<stdlib.h>
#define INF 0xfffffff


  void merge(int *a,int p,int q,int r)
  {
   int n1,n2;
   int i,j; 
   int k;
   n1=q-p+1;
   n2=r-q;
   int l[n1];
   int d[n2];
   for (i=0;i<n1;i++)
   {
     l[i]=a[p+i];
   }
     l[n1]=INF;
   for(j=0;j<n2;j++)
   {
     d[j]=a[q+j+1];
   }
   d[n2]=INF;
   i=0;j=0;
   for(k=p;k<=r;k++)
   if(l[i]<=d[j])
   {
     a[k]=l[i];
     i++;
   }
   else
   {
     a[k]=d[j];
     j++;
   }  
  }
  
  
  void mergesort(int a[],int p,int r)
  {    int q;
       if(p<r)
       {
       q=(p+r)/2;
       mergesort(a,p,q);
       mergesort(a,q+1,r);
       merge(a,p,q,r);
       }
  }
  
  
  int main ()
  {  int i,j;
  int c[10];
  int p=0,r=9;
    for(i=0;i<10;i++)
    scanf("%d",&c[i]);
      mergesort(c,p,r);
      for(j=0;j<10;j++)
      printf("%d ",c[j]);
      printf("\n");
      system("pause");
      return 0;
  }


下面这个程序也为mergesort.是从别处粘来的,忘了从哪儿了,还望原作者见谅

#include <stdio.h>
#include <stdlib.h>


void Merge(int *R,int low,int m,int high)
{
 int i=low,j=m+1,p=0;
 int *R1; 
 R1=(int *)malloc((high-low+1)*sizeof(int));
    if(!R1)
  return; 
 while(i<=m&&j<=high) 
  R1[p++]=(R[i]<=R[j])?R[i++]:R[j++];
 while(i<=m) 
  R1[p++]=R[i++];
 while(j<=high) 
  R1[p++]=R[j++];
 for(p=0,i=low;i<=high;p++,i++)
  R[i]=R1[p];
}
void MergeSort(int R[],int low,int high)
{
 int mid;
 if(low<high)
 {
  mid=(low+high)/2;
        MergeSort(R,low,mid);
        MergeSort(R,mid+1,high);
        Merge(R,low,mid,high);
 }
}
int main(void)
{
 int i;
 int a[10];
 int low=0,high=9;
 for (i = 0; i < 10; i++)
  scanf("%d",&a[i]);
 MergeSort(a,low,high);
 for(i=low;i<=high;i++)
  printf("%d ",a[i]);
 printf("\n");
 system("pause");
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值