自己写的 合并排序

来源:互联网 发布:手机移动数据自己开 编辑:程序博客网 时间:2024/04/28 05:49
#include <stdio.h>
#include <math.h> 
#include <stdlib.h>


int merge_sort(int a[],int p,int r);//函数声明 ,为调用做准备
    int merge (int a[],int p,int q,int r);




int main(void)
{







int a[80]; //申请数组空间,存放待排序数列
a[9]=2; a[10]=4; //为待排序数组赋值
a[11]=5; a[12]=7; // 待排序数组伟 a【9....16] 
a[13]=1; a[14]=2;
a[15]=3; a[16]=6;





int p,r; //需要用到的数组下标
p=9; r=16;
merge_sort(a,9,16);// 调用 merge-sort过程,将数组 a【】及其下标 p,r作为参数传递





int i; //输出 排序后的 数组
for(i=9;i<=16;i++)
printf("%d\n",a[i]);

return 0;


}


/*合并过程*/


int merge (int a[],int p,int q,int r)
{
int n1=q-p+1;
int n2=r-q;


//printf("%d\t %d\t %d\t",p,q,r);
//getchar();


int left[40],right[40];




int i,j,k;


for(i=1;i<=n1;i++) 
left[i]=a[p+i-1];
for(j=1;j<=n2;j++)
right[j]=a[q+j];


left[n1+1]=10000;
right[n2+1]=10000;//两个哨兵


i=1;j=1;
for(k=p;k<=r;k++)
{
if (left[i]<=right[j] )
{ a[k]=left[i]; i++;}
else {a[k]=right[j];j++;};
}


return 0;
}


/* 排序过程*/


int merge_sort (int a[],int p,int r)
{
int q=0; // 会用到的数组下标


if (p<r ) 
{
q=(int) (p+r)/2;


merge_sort(a,p,q);// 逐步分解问题
merge_sort(a,q+1,r);


merge (a,p,q,r);//合并
}


return 0;


}




虽然开始漏洞百出,但是自己写的过程中,确实收获很多啊。




原创粉丝点击