#include<stdio.h>
#include<stdlib.h>
/*
**归并排序的主要思想:分治法 Divide and Conquer
**1 Divide: 将数组array[p,q),从中间分开,分成两个子数组sub1[p,r),sub2[r,q);
**2 Conquer: 递归调用merge_sort,直到p+1==q,只有一个元素;
**3 Combine: 对两个有序的子数组[p,r),[r,q)进行合并,得到的结果放到[p,q)中返回
*/
#include<stdlib.h>
/*
**归并排序的主要思想:分治法 Divide and Conquer
**1 Divide: 将数组array[p,q),从中间分开,分成两个子数组sub1[p,r),sub2[r,q);
**2 Conquer: 递归调用merge_sort,直到p+1==q,只有一个元素;
**3 Combine: 对两个有序的子数组[p,r),[r,q)进行合并,得到的结果放到[p,q)中返回
*/
//void merge_sort(int *pa,int *pb);
void merge_sort(int *p,int len);
void order_sort(int *p,int *r,int *q)//对两个子有序数组[p,r)和[r,q)进行整合排序,得到的排序结果复制到[p,q)中
{
int size=q-p;
int *buf=malloc(size*sizeof(int));
int *pBuf=buf;
int *pa=p,*pb=r;
while(pa!=r && pb!=q)
{
if(*pa<*pb) //将pa指向的内容复制到pBuf中,pBuf++,pa++
*pBuf++=*pa++;
else
*pBuf++=*pb++;
}
if(pa==r) //若pa先结束,则将pb剩余的值全部复制到pBuf中
{
while(pb!=q)
*pBuf++=*pb++;
}
if(pb==q)
{
while(pa!=r)
*pBuf++=*pa++;
}
for(pBuf=buf,pa=p;pBuf<buf+size && pa<q;pBuf++) //将pBuf里面的所有内容复制到[p,q)中
*pa++=*pBuf;
free(buf);
return ;
}
#if 0
void merge_sort(int *p,int *q)
{
if((q-p)==1)
return;
int *r=p+(q-p)/2;
merge_sort(p,r);
merge_sort(r,q);
order_sort(p,r,q);
}
#endif
#if 1
void merge_sort(int *p,int len)
{
int *q=p+len;
if((q-p)==1)
return;
int *r=p+len/2;
merge_sort(p,r-p);
merge_sort(r,q-r);
order_sort(p,r,q);
}
#endif
int main()
{
printf("please input 5 numbers:\n");
int num[5];
int i;
for(i=0;i<5;i++)
scanf("%d",num+i); //need to change
printf("\nthe numbers are:\n");
for(i=0;i<5;i++)
printf("%d ",num[i]); //need to change
printf("\n");
merge_sort(num,5);
// merge_sort(num,num+5);
printf("afer sort the numbers are:\n");
for(i=0;i<5;i++)
printf("%d ",num[i]); //need to change
printf("\n");
return 0;
}