您的位置:首页 > 其它

归并排序

2015-07-13 10:32 204 查看
//归并算法
//主要分两个部分,第一步是分解,拆分到每组只剩下一个,第二步是合并,保持归并之后组内有序。运用递归。
void MergeSort(int arr[],int head,int area)
{
if (head<area) {
int min=(head+area)/2;
MergeSort(arr, head, min);
MergeSort(arr, min+1, area);
Merger(arr, head, min, area);
}
}
//归并
//先给申请额外的辅助空间
void Merger(int arr[],int head,int min,int area)
{
int *arr1=(int *)malloc(sizeof(int)*(min-head+2)); //不算0
int *arr2=(int *)malloc(sizeof(int)*(area-min+1));
//赋值,这里设置了一个无限大的哨兵,那么在一个数组没有东西之后就剩下这个无线大,那么另一个数组就能全部自动转入目标数组,不用多余的判断,但是要再循环里控制数量,以免哨兵的加入。
int i;
for(i=head;i<=min;i++)
{
arr1[i-head]=arr[i];
}
arr1[i-head]=INFINE;
for(i=min+1;i<=area;i++)
{
arr2[i-min-1]=arr[i];
}
arr2[i-min-1]=INFINE;
//进行归并放到arr的head到area

int p=head;
int p1=0;int p2=0;
for (; p<=area; p++) {
if (arr1[p1]<=arr2[p2]) {
arr[p]=arr1[p1];
p1++;
}
else
{
arr[p]=arr2[p2];
p2++;
}
}
free(arr1);
free(arr2);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: