您的位置:首页 > 编程语言 > C语言/C++

分治法之归并排序

2015-11-10 22:20 232 查看
/*************************************************
分治法之归并排序:时间复杂度为O(nlgn)
升序排列。
分治法的三部曲:
1:分解;
2:解决;
3:合并;
**************************************************/
#include <stdio.h>
#include <stdlib.h>

//合并函数
void merge(int *A,int low,int mid,int high)
{
int n1=mid-low+1;//左半部分的数组长度
int n2=high-mid;//右半部份的数组长度

int *left=new int[n1];
int *right=new int[n2];

//记录左半部分的数组元素
for(int i=0;i<n1;i++)
{
left[i]=A[low+i];
}

//记录右半部份的数组元素
for(int i=0;i<n2;i++)
{
right[i]=A[mid+1+i];
}

//将左半部分元素依次和右半部份元素比较,
//每次取出最小的放回原数组,实现排序
for(int i=0,j=0,k=low;k<=high;)
{
if(left[i]<=right[j])
{
A[k]=left[i];
i++;
k++;
}
else
{
A[k]=right[j];
j++;
k++;
}
}
}

//归并排序(递归函数)
void merge_sort(int *A,int low,int high)
{
if(low<high)
{
int mid=(low+high)/2;
merge_sort(A,low,mid);
merge_sort(A,mid+1,high);
merge(A,low,mid,high);
}
}
int main()
{
int temp,length,*A;
while(scanf("%d",&length)==1)
{
if(length!=0)
{
//输入数组元素
A=new int[length];
for(int i=0;i<length;i++)
{
scanf("%d",&A[i]);
}
/*归并排序算法核心********************************/
merge_sort(A,0,length-1);
/***************************************************/
//输出已排序数组
for(int i=0;i<length;i++)
{
printf("%d ",A[i]);
}
}
else break;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息