正在加载图片...
p->next=q: p-q q->next rr->next i//while while(ql=el->next) p->next=q p-q q=q->next p->next=, p-r; rr->next //Linked List Merge,与上一题完全相同 10.39 void SL Merge(int al[], int 11,it2/把长度分别为l1且12<(11+2)的两个有序 子序列归并为有序序列 start1=0ta2=11;1分别表示序列1和序列2的剩余未归并部分的起始位置 for(i=0;i<11计++)/插入第i个元素 for(j= start2j<11+12&&ka[}a[ start1+ilj+);∥寻找插入位置 k=j-start2,Ⅶk为要向右循环移动的位数 RSh( a, start1 j-1k);/将 a[start1]到aj-l之间的子序列循环右移k位 start 1+=k+1 start2元,∥修改两序列尚未归并部分的起始位置 J//SL Merge void rsh(inta[ Int start, int end. int k将 a start]到aend]之间的子序列循环右移k 位,算法原理参见518 len=end-start+1 fo(i=1;i<=k;计 i(len%=0&&k%=0)p=i,∥求len和k的最大公约数p for(i=0ip;H+)∥对p个循环链分别进行右移{ p->next=q;p=q; q=q->next; } else { p->next=r;p=r; r=r->next; } }//while while(q!=e1->next) { p->next=q;p=q; q=q->next; } while(r!=e2->next) { p->next=r;p=r; r=r->next; } }//LinkedList_Merge,与上一题完全相同 10.39 void SL_Merge(int a[ ],int l1,int l2)//把长度分别为 l1,l2 且 l1^2<(l1+l2)的两个有序 子序列归并为有序序列 { start1=0;start2=l1; //分别表示序列 1 和序列 2 的剩余未归并部分的起始位置 for(i=0;i<l1;i++) //插入第 i 个元素 { for(j=start2;j<l1+l2&&a[j]<a[start1+i];j++); //寻找插入位置 k=j-start2; //k 为要向右循环移动的位数 RSh(a,start1,j-1,k);//将 a[start1]到 a[j-1]之间的子序列循环右移 k 位 start1+=k+1; start2=j; //修改两序列尚未归并部分的起始位置 } }//SL_Merge void RSh(int a[ ],int start,int end,int k)//将 a[start]到 a[end]之间的子序列循环右移 k 位,算法原理参见 5.18 { len=end-start+1; for(i=1;i<=k;i++) if(len%i==0&&k%i==0) p=i; //求 len 和 k 的最大公约数 p for(i=0;i<p;i++) //对 p 个循环链分别进行右移
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有