❶ 归并算法指导
你想在一个字符串中找最大的字符。 只需要将字符串搜索一边就好。 没必要归并。
而且,如果你说你是为了练习归并,一定要用归并。
那么首先,你的程序应该不对。
你可以看下 maxchar 函数, 你使用了递归, 但是我却发现, 你的每一次递归终点都是返回 a【0】。
而且, 你想要找最大的char。 但是,maxchar中却完全没有比较的部分, 不必较如何知道哪个大?
通过我的观察,介位同学,你应该是拿某个教科书上的代码想当然的该处来的这个代码吧。。。
我不多说了。 如果想实现功能,请参照第一句话。。。
另外,如果是学习c语言,由于我们很难接触到c的项目(不像c++,java,项目很好找)。 所以,如果想练习,可以去acm上练习。
个人推荐 poj(若没去过,在网络上直接搜poj)。 因为论坛内容较多。
当然,有些新人觉得acm难, 那么可以试试 projecteuler.net. 这个网站念头也不少了,而且开头的题目比较简单。。
如果都觉得难,不想做。
那么最好考虑去做java,c++。 工程方面的项目。。
❷ 请将合并矩阵·整体逻辑加入理解·样本数字·合并矩阵算法中描绘。
摘要 1.实现这个功能的软件也很多,还是烦请大家先自己搜索几个教程,入门请统一用htseq-count,对每个样本都会输出一个表达量文件。
❸ 集合的合并运算 怎么个算法,求大神解答
集合的合并运算是交,并,补,的运算
❹ 顺序表的建立、合并、归并算法实现
#include <stdio.h>
#include <malloc.h>
void disp(int *a,int n);
int * create(int n);
int * merger_link(int *a,int *b,int n,int m);
void merge(int *a, int low, int m, int high);
void merge_sort(int *a,int low,int high);
int main()
{
int *a=NULL,*b=NULL,*c=NULL; //顺序表
int n,m;
printf("输入第一个顺序表的大小:\n");
scanf("%d",&n);
a = create(n);
printf("输入第二个顺序表的大小:\n");
scanf("%d",&m);
b = create(m);
printf("合并:\n");
c = merger_link(a,b,n,m);
disp(c,n+m);
printf("归并排序:\n");
merge_sort(c,0,n+m-1);
disp(c,n+m);
if(a) free(a);
if(b) free(b);
if(c) free(c);
return 0;
}
/*建立*/
int *create(int n)
{
int *p,i;
p = (int *)malloc(sizeof(int)*n);
printf("输入顺序表的各个数值(整数,以空格分开):\n");
for(i=0;i<n;i++)
scanf("%d",&p[i]);
return p;
}
/*合并,把两个表连接起来*/
int *merger_link(int *a,int *b,int n,int m)
{
int *p,i=0,j=0;
p = (int *)malloc(sizeof(int)*(n+m));
while(n--)
p[i++] = a[j++];
j=0;
while(m--)
p[i++] = b[j++];
return p;
}
/*将两个有序段合成一个有序段*/
void merge(int *a, int low, int m, int high)
{
int i=low, j=m+1 ,p=0;
int *t;
t = (int *)malloc((high-low+1)*sizeof(int));
while(i<=m && j<=high)
t[p++]=(a[i] <= a[j]) ? a[i++] :a[j++];
while(i <= m)
t[p++]=a[i++];
while(j <= high)
t[p++]=a[j++];
for(p=0, i=low; i<=high; p++,i++)
a[i]=t[p];
free(t);
}
/*归并排序,二路归并*/
void merge_sort(int *a,int low,int high)
{
int mid;
if(low<high)
{
mid = (low+high)/2;
merge_sort(a, low, mid);
merge_sort(a, mid+1, high);
merge(a, low, mid, high);
}
}
/*显示*/
void disp(int *a,int n)
{
int i;
for(i=0;i<n;i++)
printf("%d ",a[i]);
printf("\n");
}
❺ 实现顺序表的基本操作,编写将两个顺序表合并的算法或程序
将A表中元素依次拿出,每拿出一个元素,将它插入到B表结尾并进行排序,直到将所有A表中所有元素都拿出完为止
❻ 有没有一种归并算法可以合并号段的
成都 1388000
至
成都 1388009
是不是十个数都得有,才可以缩短一位
中间如果没有成都 1388002时,怎么处理?
❼ 设计链表合并算法,将两个已排序(升序)的单链表,合并成一个链表而不改变其有序性。用c语言编写。
#include <stdio.h>
#include <malloc.h>
typedef struct node
{
int data;
struct node *next;
}List;
List *create(List *head,int n)//创建链表
{
List *p,*q;
q=(List *)malloc(sizeof(List));
q->data=n;
q->next=NULL;
p=head;
while(p->next!=NULL)p=p->next;
p->next=q;
return head;
}
void print(List *head)//输出链表
{
List *p;
p=head->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
}
List *LINK(List *head1,List *head2)//连接链表
{
List *p;
p=head1;
while(p->next!=NULL)p=p->next;
p->next=head2->next;
return head1;
}
main()
{
int i;
List *head1,*head2,*link1;
head1=(List *)malloc(sizeof(List));
head1->next=NULL;
head2=(List *)malloc(sizeof(List));
head2->next=NULL;
for(i=1;i<=5;i++)head1=create(head1,i);//输入链表1
printf("链表1:\n");
print(head1);
printf("\n链表2:\n");
for(i=6;i<=10;i++)head2=create(head2,i);//输入链表2
print(head2);
link1=LINK(head1,head2);
printf("\n连接后的链表:\n");
print(link1);
}
❽ 按照5比1的比例把两种算法合并起来叫什么方法
有这种算法吗
❾ 合并排序的实现
程序1 /****************************//*author:不辞远*//****************************/#include<malloc.h>#include<stdlib.h>voidmergesort(int*a,intlength){intstep;int*p,*q,*t;inti,j,k,len1,len2;int*temp;step=1;p=a;q=(int*)malloc(sizeof(int)*length);temp=q;while(step<length){i=0;j=i+step;k=i;len1=i+step<length?i+step:length;len2=j+step<length?j+step:length;while(i<length){while(i<len1&&j<len2){q[k++]=p[i]<p[j]?p[i++]:p[j++];}while(i<len1){q[k++]=p[i++];}while(j<len2){q[k++]=p[j++];}i=j;j=i+step;k=i;len1=i+step<length?i+step:length;len2=j+step<length?j+step:length;}step*=2;t=p;p=q;q=t;}if(a!=p){memcpy(a,p,sizeof(int)*length);}free(temp);}voidmain(void){intarrary[]={9,6,1,3,8,4,2,0,5,7};mergesort(arrary,10);}程序2
排序位于[begin, end)中的整数 voidsort(int*begin,int*end){intsize=end-begin;int*p,*p1,*p2,*mid=begin+size/2;if(size<=1)return;//边界条件sort(begin,mid);//递归求解sort(mid,end);p=(int*)malloc(size*sizeof(int));//申请临时空间for(p1=begin,p2=mid;p1!=mid||p2!=end;)//合并有序表*p++=(p2==end||p1!=mid&&*p1<*p2)?(*p1++):(*p2++);for(p-=size;begin!=end;)//回填*begin++=*p++;free(p-size);//释放临时空间}程序3 #include<iostream>#include<stdlib.h>usingnamespacestd;voidMerge(int*A,intp,intq,intr){inti,j,k;intn1=q-p+1;intn2=r-q;int*L=(int*)malloc(sizeof(int)*(n1+2));int*R=(int*)malloc(sizeof(int)*(n2+2));for(i=1;i<=n1;i++){L[i]=A[p+i-1];}for(j=1;j<=n2;j++){R[j]=A[q+j];}L[n1+1]=0x7FFFFFFF;R[n2+1]=0x7FFFFFFF;i=1;j=1;for(k=p;k<=r;k++){if(L[i]<=R[j]){A[k]=L[i];i++;}else{A[k]=R[j];j++;}}}voidMergeSort(int*A,intp,intr){if(p<r){intq=(p+r)/2;MergeSort(A,p,q);MergeSort(A,q+1,r);Merge(A,p,q,r);}}intmain(){inta[10]={214,3636,22,55,37,45,12,54,264,52};MergeSort(a,0,9);for(inti=0;i<10;i++){printf(%d,a[i]);}printf(
);return0;}C++#include<iostream>#include<string>usingnamespacestd;//合并排序//合并两部分有序数组time:O(n)template<typenameT>voidMerge(T*arry,intstart,intp,intend){intlsize=p-start,rsize=end-p;//两个数组的大小T*l=newT[lsize],*r=newT[rsize];//要合并的两个数组memcpy(l,arry+start,sizeof(T)*lsize);memcpy(r,arry+p,sizeof(T)*rsize);//将要合并的数组复制intlnow=0,rnow=0,i;//未合并的数字的位置for(i=0;lnow<lsize&&rnow<rsize;i++){if(l[lnow]>r[rnow])//取较大的数{arry[start+i]=l[lnow];lnow++;}else{arry[start+i]=r[rnow];rnow++;}}if(lnow==lsize&&rnow!=rsize)//其中一个数组合并完以后,复制剩下的数据{memcpy(arry+start+i,r+rnow,sizeof(T)*(rsize-rnow));}elseif(rnow==rsize&&lnow!=lsize){memcpy(arry+start+i,l+lnow,sizeof(T)*(lsize-lnow));}deletel;deleter;//清理内存return;}//排序函数time:O(nlgn)template<typenameT>voidMergeSort(T*arry,intstart,intend){if(end-start>1)//当元素个数为1时直接返回{intp=(start+end)/2;//切割数组MergeSort(arry,start,p);MergeSort(arry,p,end);//分别排序Merge(arry,start,p,end);//合并数组}}intmain(){intarry[10]={7,3,4,7,10,9,1,5,3,7};inti;MergeSort(arry,0,10);for(i=0;i<10;i++){cout<<arry[i]<<'';}return0;}
❿ 合并排序算法
能不能描述细点。
逐步求精不是用来设计排序算法的。而是用来求拟合的多。
如果排序不对就是不对,难道你想要一半对一半不对的排序结果?
不过也可以说得过去。
就是你把排序分成几个部分,类似于快速排序。
比如20个数,先排左边10个,在排后面10个,在合并,难道这样叫逐步求精?
请再说清楚一下。