當前位置:首頁 » 操作系統 » 合並演算法

合並演算法

發布時間: 2022-01-18 00:06:30

Ⅰ 設計鏈表合並演算法,將兩個已排序(升序)的單鏈表,合並成一個鏈表而不改變其有序性。用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);
}

Ⅱ 合並排序的實現

程序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;}

Ⅲ 請將合並矩陣·整體邏輯加入理解·樣本數字·合並矩陣演算法中描繪。

摘要 1.實現這個功能的軟體也很多,還是煩請大家先自己搜索幾個教程,入門請統一用htseq-count,對每個樣本都會輸出一個表達量文件。

Ⅳ 按照5比1的比例把兩種演算法合並起來叫什麼方法

有這種演算法嗎

Ⅳ 實現順序表的基本操作,編寫將兩個順序表合並的演算法或程序

將A表中元素依次拿出,每拿出一個元素,將它插入到B表結尾並進行排序,直到將所有A表中所有元素都拿出完為止

Ⅵ 有沒有一種歸並演算法可以合並號段的

成都 1388000

成都 1388009

是不是十個數都得有,才可以縮短一位

中間如果沒有成都 1388002時,怎麼處理?

Ⅶ 歸並演算法指導

你想在一個字元串中找最大的字元。 只需要將字元串搜索一邊就好。 沒必要歸並。
而且,如果你說你是為了練習歸並,一定要用歸並。
那麼首先,你的程序應該不對。
你可以看下 maxchar 函數, 你使用了遞歸, 但是我卻發現, 你的每一次遞歸終點都是返回 a【0】。
而且, 你想要找最大的char。 但是,maxchar中卻完全沒有比較的部分, 不必較如何知道哪個大?

通過我的觀察,介位同學,你應該是拿某個教科書上的代碼想當然的該處來的這個代碼吧。。。
我不多說了。 如果想實現功能,請參照第一句話。。。

另外,如果是學習c語言,由於我們很難接觸到c的項目(不像c++,java,項目很好找)。 所以,如果想練習,可以去acm上練習。
個人推薦 poj(若沒去過,在網路上直接搜poj)。 因為論壇內容較多。

當然,有些新人覺得acm難, 那麼可以試試 projecteuler.net. 這個網站念頭也不少了,而且開頭的題目比較簡單。。
如果都覺得難,不想做。
那麼最好考慮去做java,c++。 工程方面的項目。。

Ⅷ 合並排序演算法

能不能描述細點。
逐步求精不是用來設計排序演算法的。而是用來求擬合的多。
如果排序不對就是不對,難道你想要一半對一半不對的排序結果?
不過也可以說得過去。
就是你把排序分成幾個部分,類似於快速排序。
比如20個數,先排左邊10個,在排後面10個,在合並,難道這樣叫逐步求精?
請再說清楚一下。

Ⅸ 順序表的建立、合並、歸並演算法實現

#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");
}

Ⅹ 集合的合並運算 怎麼個演算法,求大神解答

集合的合並運算是交,並,補,的運算

熱點內容
訪問攔截怎麼解除安卓 發布:2024-09-20 17:28:48 瀏覽:273
蘿卜干存儲 發布:2024-09-20 17:21:37 瀏覽:714
蘋果手機如何遷移軟體到安卓手機 發布:2024-09-20 17:21:34 瀏覽:691
查看伺服器ip限制 發布:2024-09-20 16:56:27 瀏覽:388
p搜系統只緩存1頁為什麼 發布:2024-09-20 16:48:51 瀏覽:838
上網的賬號和密碼是什麼東西 發布:2024-09-20 16:31:31 瀏覽:612
安卓手機王者榮耀如何調超高視距 發布:2024-09-20 16:31:30 瀏覽:428
安卓G是什麼app 發布:2024-09-20 16:23:09 瀏覽:81
iphone怎麼壓縮文件 發布:2024-09-20 16:08:18 瀏覽:356
linux查看用戶名密碼是什麼 發布:2024-09-20 16:03:20 瀏覽:744