# include <stdio.h>
# include <stdlib.h>
/**
* 时间:2016年6月6日 00:20:00
* 内容:归并排序
*/
void Merge(int*,int *,int,int,int);
void MergePass(int*,int*,int,int);
void MergeSort(int*,int*,int);
void Info(int*,int);
int main(void)
{
int a[10]={26,5,77,1,61,11,59,15,48,19};
int b[10]={0};
Info(a,10);
MergeSort(a,b,10);
Info(b,10);
return 0;
}
/**
* 将两个有序的序列initlist[left,mid],
* initList[mid+1,right]排序归并到mergeList中去
* |--PS:这里指的是将initlist分为两段数组,进行归并排序.
* @param initList 未排序的数组
* @param mergeList 排序后的数组
* @param left 最右边的元素角标
* @param mid 中间+1个元素的角标
* @param right 最右边元素的角标
*/
void Merge(int* initList,int* mergeList,int left,int mid,int right)
{
int i=left;
int j=mid+1;
int k=left;
while(i<=mid&&j<=right)
{
// 比较两端数组的元素的大小,进行排序
if (initList[i]<initList[j])
mergeList[k++]=initList[i++];
else
mergeList[k++]=initList[j++];
// 判断边界值,如果如果超过,就将这些元素直接复制到数组后面
if(i>mid)
while(j<=right)
mergeList[k++]=initList[j++];
else if (j>right)
while(i<=mid)
mergeList[k++]=initList[i++];
}
}
void Info(int*a,int n)
{
for (int i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
/**
* 合并大小为s的相邻数组
* @param initList 未排序的数组指针
* @param mergeList 排序后的数组指针
* @param n 数组的总长为n个
* @param s 归并后的大小
*/
void MergePass(int* initList,int* mergeList,int n,int s)
{
int i,j;
for(i=0;i<=n-2*s+1;i+=2*s)
Merge(initList,mergeList,i,i+s-1,i+2*s-1);
// 剩下的元素个数大于s小于2*s,对这一段用Merge函数
if (i+s<n)
Merge(initList,mergeList,i,i+s-1,n-1);
// 剩下的元素个数小于s,直接从initList复制到mergeList里
else
for(j=i;j<=n-1;j++)
mergeList[j]=initList[j];
}
void MergeSort(int* a,int* b,int n)
{
int s=1;
while(s<n)
{
MergePass(a,b,n,s);
s*=2;
MergePass(b,a,n,s);
}
}
归并排序
最新推荐文章于 2017-01-13 08:44:09 发布