归并排序及其适用范围
2014-03-31 22:23
211 查看
归并排序的运行时间是O(NlogN),但它很难用于主存排序,主要问题在于合并两个排序的表需要线性附加的内存,而且还需要讲述据拷贝到临时数组仔拷贝回来这样的附加工作,严重地放慢了排序速度。归并排序一般会用在外部排序的算法中。
void Merge(int A[], int TmpArray[], int Lpos, int Rpos, int RightEnd)
{
int i, LeftEnd, NumElements, TmpPos;
LeftEnd = Rpos - 1;
TmpPos = Lpos;
NumElements = RightEnd - Lpos + 1;
while(Lpos <= LeftEnd && Rpos <= RightEnd){
if(A[Lpos] <= A[Rpos])
TmpArray[TmpPos++] = A[Lpos++];
else
TmpArray[TmpPos++] = A[Rpos++];
}
while(Lpos <= LeftEnd)
TmpArray[TmpPos++] = A[Lpos++];
while(Rpos <= RightEnd)
TmpArray[TmpPos++] = A[Rpos++];
for(i = 0; i < NumElements; i++, RightEnd--)
A[RightEnd] = TmpArray[RightEnd];
}
void MSort(int A[], int TmpArray[], int Left, int Right)
{
int Center;
if(Left < Right)
{
Center = (Left + Right)/2;
MSort(A, TmpArray, Left, Center);
MSort(A, TmpArray, Center+1, Right);
Merge(A, TmpArray, Left, Center + 1, Right);
}
}
void Mergesort(int A[], int N)
{
int *TmpArray;
TmpArray = (int *)malloc(N * sizeof(int));
if( TmpArray != NULL)
{
MSort(A, TmpArray, 0, N-1);
free(TmpArray);
}else{
return;
}
}
void Merge(int A[], int TmpArray[], int Lpos, int Rpos, int RightEnd)
{
int i, LeftEnd, NumElements, TmpPos;
LeftEnd = Rpos - 1;
TmpPos = Lpos;
NumElements = RightEnd - Lpos + 1;
while(Lpos <= LeftEnd && Rpos <= RightEnd){
if(A[Lpos] <= A[Rpos])
TmpArray[TmpPos++] = A[Lpos++];
else
TmpArray[TmpPos++] = A[Rpos++];
}
while(Lpos <= LeftEnd)
TmpArray[TmpPos++] = A[Lpos++];
while(Rpos <= RightEnd)
TmpArray[TmpPos++] = A[Rpos++];
for(i = 0; i < NumElements; i++, RightEnd--)
A[RightEnd] = TmpArray[RightEnd];
}
void MSort(int A[], int TmpArray[], int Left, int Right)
{
int Center;
if(Left < Right)
{
Center = (Left + Right)/2;
MSort(A, TmpArray, Left, Center);
MSort(A, TmpArray, Center+1, Right);
Merge(A, TmpArray, Left, Center + 1, Right);
}
}
void Mergesort(int A[], int N)
{
int *TmpArray;
TmpArray = (int *)malloc(N * sizeof(int));
if( TmpArray != NULL)
{
MSort(A, TmpArray, 0, N-1);
free(TmpArray);
}else{
return;
}
}
相关文章推荐
- 【每日算法】归并排序及其应用(逆序对&合并有序链表)
- 九大排序算法及其实现- 插入.冒泡.选择.归并.快速.堆排序.计数.基数.桶排序.堆排序
- 面试题:在O(1)空间复杂度范围内对一个数组中前后连段有序数组进行归并排序
- 几种软件开发模型优缺点及其适用范围
- 过滤器:高效自清洗过滤器特点及其适用范围简述
- 二路归并排序简介及其并行化
- 二路归并排序简介及其并行化
- Ajax技术入门及其适用范围
- 归并排序及其分析
- 算法系列(四)归并排序及其改进(java实现)
- 归并排序及其时间复杂度分析
- 二路归并排序及其改进方法
- 归并排序及其时间复杂度分析
- 排序--归并算法思想及其代码实现
- 简单选择排序的Java实现、性能分析以及适用场景
- SDUTACM 数据结构实验之排序五:归并求逆序数
- [排序算法]--归并排序的Java实现
- 服务器和客户端的交互方式(Socket,http协议)和各自特点适用范围
- 【数据结构与算法】归并排序
- java代码初学者适用,输入学生成绩,符合要求的过~~~~注意数据范围