合并排序的c语言实现
2014-08-13 21:11
169 查看
#include <stdio.h>
/*
merge()作用:把A[p]-A[q]和A[q+1]-A[r]两个递增的数组合并为一个数组A[r]中
*/
void merge(int A[],int p,int q,int r)
{
int *bp = new int[r-p+1];
int i=p,j=q+1,k=0;
while(i<=q&&j<=r)
{
if(A[i]<A[j])
{
bp[k++]=A[i++];
}else
{
bp[k++]=A[j++];
}
}
if(j<=r)
{
while(j<=r)
{
bp[k++]=A[j++];
}
}
if(i<=q)
{
while(i<=q)
{
bp[k++]=A[i++];
}
}
k=0;
while(p<=r)
{
A[p++]=bp[k++];
}
}
/*
i:合并的开始项
s:合并之前项的大小
t:合并之后项的大小
*/
void merge_sort(int A[],int n)
{
int i,s,t=1;
t=1;
while(t<n)
{
i=0;
s=t;
t=2*s;
while(i+t<n)
{/*
两种情况会终止
1,i+s<n但是i+s>n 对于这种情况下面的if(i+s<n)会处理,把i+s-1和i+s到n-1项合并
2,i+s<n 留到下一次去合并
*/
merge(A,i,i+s-1,i+t-1);
i=i+t;
}
if(i+s<n)
merge(A,i,i+s-1,n-1);
}
}
int main()
{
/*
测试前面的 merge()函数
int A[10]={2,3,11,44,50,11,17,43,78,112};
int i=0;
merge(A,0,4,9);
for(i=0;i<=9;i++)
printf("%d ",A[i]);
*/
int A[10]={1,4,22,33,55,11,23,43,12,32};
merge_sort(A,10);
for(int i=0;i<=9;i++)
printf("%d ",A[i]);
return 0;
}
/*
merge()作用:把A[p]-A[q]和A[q+1]-A[r]两个递增的数组合并为一个数组A[r]中
*/
void merge(int A[],int p,int q,int r)
{
int *bp = new int[r-p+1];
int i=p,j=q+1,k=0;
while(i<=q&&j<=r)
{
if(A[i]<A[j])
{
bp[k++]=A[i++];
}else
{
bp[k++]=A[j++];
}
}
if(j<=r)
{
while(j<=r)
{
bp[k++]=A[j++];
}
}
if(i<=q)
{
while(i<=q)
{
bp[k++]=A[i++];
}
}
k=0;
while(p<=r)
{
A[p++]=bp[k++];
}
}
/*
i:合并的开始项
s:合并之前项的大小
t:合并之后项的大小
*/
void merge_sort(int A[],int n)
{
int i,s,t=1;
t=1;
while(t<n)
{
i=0;
s=t;
t=2*s;
while(i+t<n)
{/*
两种情况会终止
1,i+s<n但是i+s>n 对于这种情况下面的if(i+s<n)会处理,把i+s-1和i+s到n-1项合并
2,i+s<n 留到下一次去合并
*/
merge(A,i,i+s-1,i+t-1);
i=i+t;
}
if(i+s<n)
merge(A,i,i+s-1,n-1);
}
}
int main()
{
/*
测试前面的 merge()函数
int A[10]={2,3,11,44,50,11,17,43,78,112};
int i=0;
merge(A,0,4,9);
for(i=0;i<=9;i++)
printf("%d ",A[i]);
*/
int A[10]={1,4,22,33,55,11,23,43,12,32};
merge_sort(A,10);
for(int i=0;i<=9;i++)
printf("%d ",A[i]);
return 0;
}
相关文章推荐
- C语言实现合并排序
- C语言单向动态链表程序,实现链表的建立,合并,重新排序,链表元素的插入与删除,以及根据元素成员的值进行元素删除。
- 合并排序(C语言实现)
- 合并排序的c语言实现
- c语言之合并排序实现
- C语言实现八种基本排序(四)
- C语言实现八种基本排序(三)
- 各种算法的C#实现系列1 - 合并排序的原理及代码分析
- 经典排序思想,并用C语言指针实现排序算法
- C语言实现冒泡和直接插入排序
- W. :利用最小优先级队列实现对k个已序队列的合并排序。习题6.5-8
- C语言实现八种基本排序(二)
- 各种排序方法的C语言实现
- C语言实现直接插入排序
- W. :利用合并排序和二分查找实现习题2.3-7
- 排序系列之(1)归并排序及C语言实现
- 堆排序的C语言实现
- C语言:实现N个整数排序,并插入一个整数!
- 几种排序方法的实现 (C语言)
- 几种排序方法的C语言实现