您的位置:首页 > 其它

几种常用的排序方法4--归并排序

2012-11-21 13:23 183 查看
归并排序

归并排序,又称为合并排序,它是把待排序序列分为若干个子序列,每个子序列是有序的,然后再把有序子序列合并为整体有序序列。

使用的D&C的思想:

分解:将n个元素分解为各含n/2个元素的子序列;

解决:用合并排序法对两个子序列进行递归的排序;

合并:合并两个已经排好的子序列以得到正确结果。

归并排序的速度仅次于快速排序,为稳定排序算法,一般用于对总体无序,但是各子项相对有序的数列。其最好,最坏,平均时间复杂度都是O(nlogn)。

void Merge(int A[], int p, int q, int r)//对两个已经排好序的子数列进行合并
{
int n1 = q - p + 1;//第一个子数列长度
int n2 = r - q; //第二个子数列长度
int L[n1+1], R[n2+1]; //左右两个子数列
for(int i = 1; i <= n1; i++)
{
L[i] = A[p+i-1];    //初始化
}
for(int j = 1; j <= n2; j++)
{
R[j] = A[q+j];   //初始化
}
L[n1+1] = MAXN;//哨兵值,前面定义MAXN为一个很大的数
R[n2+1] = MAXN;//使用这个哨兵值是为了避免检查每个子序列是不是空的。所有的数都不会比它大
int i = 1;
int j = 1;
for(int k = p; k <= r; k++)//有序的分别将小的数重新插入元序列中
{
if(L[i]<= R[j])
{
A[k] = L[i];
i = i + 1;
}
else
{
A[k] = R[j];
j = j + 1;
}
}
}

void Merge_Sort(int A[], int p, int r)
{
if(p < r)
{
int q = (int)((p+r)/2);  //折半分解序列
Merge_Sort(A,p,q);   //对左半部分进行归并排序
Merge_Sort(A,q+1,r);  //对右半部分进行归并排序
Merge(A,p,q,r);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: