归并排序
2013-06-22 11:45
106 查看
递归实现,挺麻烦,时间复杂度为O(nlogn),归并排序的过程,像极了一颗倒置的完全二叉树,高度为logn,可以理解为,对每一个元素都要进行深度为logn的归并。
空间复杂度为O(n+logn)
void Merge(int in[],int out[],int i,int m,int n)
{
int j,k,t;
for(k=i,j=m+1; i<=m && j<= n; k++)
{
if(in[i]<in[j])
{
out[k]=in[i];
i++;
}
else
{
out[k]=in[j];
j++;
}
}
if (i<=m)
{
for (t=0; t<=m; t++)
out[k+t]=in[i+t];
}
if (j<=n)
{
for (t=0; t<=m; t++)
out[k+t]=in[j+t];
}
}
void MSort(int arr[],int out[],int s,int t)
{
int m;
int TR2[MAXSIZE]={0};
if(s==t)
{
out[s]=arr[s];
}
else
{
m=(s+t)/2;
MSort(arr,TR2,s,m);
MSort(arr,TR2,m+1,t);
Merge(TR2,out,s,m,t);
}
}
void main()
{
int a[]={1, 5 , 2 };
const int length = sizeof(a)/sizeof(int);
int out[length]={0};
MSort(a,out,0,length-1);
int i=1;
for (i=0; i<length; i++)
printf("%d ",out[i]);
system("pause");
}
本文来自于《大话数据结构》
空间复杂度为O(n+logn)
void Merge(int in[],int out[],int i,int m,int n)
{
int j,k,t;
for(k=i,j=m+1; i<=m && j<= n; k++)
{
if(in[i]<in[j])
{
out[k]=in[i];
i++;
}
else
{
out[k]=in[j];
j++;
}
}
if (i<=m)
{
for (t=0; t<=m; t++)
out[k+t]=in[i+t];
}
if (j<=n)
{
for (t=0; t<=m; t++)
out[k+t]=in[j+t];
}
}
void MSort(int arr[],int out[],int s,int t)
{
int m;
int TR2[MAXSIZE]={0};
if(s==t)
{
out[s]=arr[s];
}
else
{
m=(s+t)/2;
MSort(arr,TR2,s,m);
MSort(arr,TR2,m+1,t);
Merge(TR2,out,s,m,t);
}
}
void main()
{
int a[]={1, 5 , 2 };
const int length = sizeof(a)/sizeof(int);
int out[length]={0};
MSort(a,out,0,length-1);
int i=1;
for (i=0; i<length; i++)
printf("%d ",out[i]);
system("pause");
}
本文来自于《大话数据结构》
相关文章推荐
- 归并排序
- 归并排序及深入
- poj2299 Ultra-QuickSort&&NYOJ117 求逆序数 (树状数组求逆序对数+离散化)+(归并排序)
- 经典排序算法(希尔排序,归并排序,快速排序,插入排序)
- 归并排序
- 排序算法(堆排序、插入排序、归并排序、快速排序)
- 归并排序(C语言版)
- 【自考】排序算法-插入、交换、选择、归并排序
- C# 插入排序 冒泡排序 选择排序 快速排序 堆排序 归并排序 基数排序 希尔排序
- 归并排序求逆序对
- poj 2299 Ultra-QuickSort (归并排序,逆序数)
- 数据结构之归并排序(递归实现)
- 数据结构与算法分析笔记(6)——归并排序
- 归并排序(php实现)
- HDU 3743 Frosh Week (归并排序)
- UVA 229---Train Swapping 冒泡排序求逆序数,归并排序求逆序数
- 归并排序
- Car race game 归并排序求逆序数
- 归并排序的实现
- 归并排序