本文目录一览:
- 1、c语言里面,归并操作怎么归并两个子序列?
- 2、c语言归并排序
- 3、c语言的归并排序
- 4、高分送!!如何用C语言实现归并排序算法!!!
- 5、如何用c语言实现两个单链表的归并
- 6、C语言 简单的归并问题
c语言里面,归并操作怎么归并两个子序列?
归并排序是在多个已经同向排序的序列上进行的,例如:
A数组{2,6}和B数组{5,9}
首先提取两个数组的首元素比较2和5,发现25,所以从A数组取走2放入新建的C数组,此时A数组中的元素成了{6},然后再次提取两个数组的首元素比较6和5,发现56,于是,从B数组取走5放入C数组,此时A数组是{6},B数组是{9},C数组是{2,5},同理比较提取下去,直到A数组或者B数组为空,此时把非空数组的元素依次复制到C数组中即完成排序。
c语言归并排序
直接上源码,仅供参考:
#includestdio.h
// 一个递归函数
void mergesort(int *num,int start,int end);
// 这个函数用来将两个排好序的数组进行合并
void merge(int *num,int start,int middle,int end);
int main()
{
// 测试数组
int num[10]= {12,54,23,67,86,45,97,32,14,65};
int i;
// 排序之前
printf("Before sorting:\n");
for (i=0; i10; i++)
{
printf("%3d",num[i]);
}
printf("\n");
// 进行合并排序
mergesort(num,0,9);
printf("After sorting:\n");
// 排序之后
for (i=0; i10; i++)
{
printf("%3d",num[i]);
}
printf("\n");
return 0;
}
//这个函数用来将问题细分
void mergesort(int *num,int start,int end)
{
int middle;
if(startend)
{
middle=(start+end)/2;
// 归并的基本思想
// 排左边
mergesort(num,start,middle);
// 排右边
mergesort(num,middle+1,end);
// 合并
merge(num,start,middle,end);
}
}
//这个函数用于将两个已排好序的子序列合并
void merge(int *num,int start,int middle,int end)
{
int n1=middle-start+1;
int n2=end-middle;
// 动态分配内存,声明两个数组容纳左右两边的数组
int *L=new int[n1+1];
int *R=new int[n2+1];
int i,j=0,k;
//将新建的两个数组赋值
for (i=0; in1; i++)
{
*(L+i)=*(num+start+i);
}
// 哨兵元素
*(L+n1)=1000000;
for (i=0; in2; i++)
{
*(R+i)=*(num+middle+i+1);
}
*(R+n2)=1000000;
i=0;
// 进行合并
for (k=start; k=end; k++)
{
if(L[i]=R[j])
{
num[k]=L[i];
i++;
}
else
{
num[k]=R[j];
j++;
}
}
delete [] L;
delete [] R;
}
c语言的归并排序
、归并简单点说就是2分法 一直除以2 然后把从0到N/2的下标 , 和 N/2+1 到N的地址传送到合并函数里面,递归调用
高分送!!如何用C语言实现归并排序算法!!!
#include iostream
using namespace std;
void merge(int array[],int left,int right)
{
int temparray[right];
for(int j=left;j=right;j++)
{
temparray[j]=array[j];
}
int middle=(left+right)/2;
int index1=left;
int index2=middle+1;
int i=left;
while((index1=middle)(index2=right))
{
if(temparray[index1]temparray[index2]) array[i++]=temparray[index1++];
else array[i++]=temparray[index2++];
}
while(index1=middle) array[i++]=temparray[index1++];
while(index2=right) array[i++]=temparray[index2++];
}
void sort(int array[],int left,int right)
{
if(leftright)
{
int middle=(left+right)/2;
sort(array,left,middle);
sort(array,middle+1,right);
merge(array,left,right);
}
}
这个不是特别的完美,但是大体上就是这么个思路啦~而且因为语法不严谨,貌似只能在c++下运行~建议看看youku上的数据结构课,然后你就会发现全明白了~
如果在c语言下运行,int temparray[right];这句话里面的right要改成你需要用的数~
如何用c语言实现两个单链表的归并
函数名、变量名出现了一些C语言的关键字,这是不允许的(比如将union作为函数名)
C语言 简单的归并问题
描述:这个问题是个类似于归并排序的问题,相当简单,只需每次将表中较小的元素提取出来,直至两表都为空为止,组成的新表即为所求。
核心代码(处理一组数据):
void fun(int a[],int b[],int n,int m){
/*数据存放在数组c中*/
int i=0,j=0,k=0;
for (k=0;kn+m;k++){
if(i=n||a[i]b[j]) {c[k]=b[j];j++;continue;}
if(j=m||a[i]b[j]) {c[k]=a[i];i++;continue;}
}
}
/*请注意检查语法错误,不过出现的几率性很小*/