九九热最新网址,777奇米四色米奇影院在线播放,国产精品18久久久久久久久久,中文有码视频,亚洲一区在线免费观看,国产91精品在线,婷婷丁香六月天

數(shù)據(jù)結(jié)構(gòu)嚴(yán)蔚敏版第十章答案

上傳人:cjc2****371 文檔編號:60174993 上傳時(shí)間:2022-03-07 格式:DOC 頁數(shù):15 大?。?13.50KB
收藏 版權(quán)申訴 舉報(bào) 下載
數(shù)據(jù)結(jié)構(gòu)嚴(yán)蔚敏版第十章答案_第1頁
第1頁 / 共15頁
數(shù)據(jù)結(jié)構(gòu)嚴(yán)蔚敏版第十章答案_第2頁
第2頁 / 共15頁

本資源只提供2頁預(yù)覽,全部文檔請下載后查看!喜歡就下載吧,查找使用更方便

10 積分

下載資源

資源描述:

《數(shù)據(jù)結(jié)構(gòu)嚴(yán)蔚敏版第十章答案》由會(huì)員分享,可在線閱讀,更多相關(guān)《數(shù)據(jù)結(jié)構(gòu)嚴(yán)蔚敏版第十章答案(15頁珍藏版)》請?jiān)谘b配圖網(wǎng)上搜索。

1、第十章 內(nèi)部排序 10.23 void Insert_Sort1(SqList &L)/監(jiān)視哨設(shè)在高下標(biāo)端的插入排序算法k=L.length;for(i=k-1;i;-i) /從后向前逐個(gè)插入排序if(L.ri.keyL.ri+1.key)L.rk+1.key=L.ri.key; /監(jiān)視哨for(j=i+1;L.rj.keyL.ri.key;+j)L.rj-1.key=L.rj.key; /前移L.rj-1.key=L.rk+1.key; /插入/Insert_Sort1 10.24 void BiInsert_Sort(SqList &L)/二路插入排序的算法int dMAXSIZE; /輔

2、助存儲(chǔ)x=L.r.key;d=x;first=1;final=1;for(i=2;i=x) /插入前部for(j=final;djL.ri.key;j-)dj+1=dj;dj+1=L.ri.key;final+;else /插入后部for(j=first;djL.ri.key;j+)dj-1=dj;d(j-2)%MAXSIZE+1=L.ri.key;first=(first-2)%MAXSIZE+1; /這種形式的表達(dá)式是為了兼顧first=1的情況/forfor(i=first,j=1;di;i=i%MAXSIZE+1,j+)/將序列復(fù)制回去L.rj.key=di;/BiInsert_Sor

3、t 10.25 void SLInsert_Sort(SLList &L)/靜態(tài)鏈表的插入排序算法L.r0.key=0;L.r0.next=1;L.r1.next=0; /建初始循環(huán)鏈表for(i=2;i=L.length;i+) /逐個(gè)插入p=0;x=L.ri.key;while(L.rL.rp.next.keyx&L.rp.next)p=L.rp.next;q=L.rp.next;L.rp.next=i;L.ri.next=q;/forp=L.r0.next;for(i=1;iL.length;i+) /重排記錄的位置while(pi) p=L.rp.next;q=L.rp.next;if

4、(p!=i)L.rpL.ri;L.ri.next=p;p=q;/for/SLInsert_Sort 10.26 void Bubble_Sort1(int a ,int n)/對包含n個(gè)元素的數(shù)組a進(jìn)行改進(jìn)的冒泡排序change=n-1; /change指示上一趟冒泡中最后發(fā)生交換的元素while(change)for(c=0,i=0;iai+1)aiai+1;c=i+1; /c指示這一趟冒泡中發(fā)生交換的元素change=c;/while/Bubble_Sort1 10.27 void Bubble_Sort2(int a ,int n)/相鄰兩趟是反方向起泡的冒泡排序算法low=0;high

5、=n-1; /冒泡的上下界change=1;while(lowhigh&change)change=0;for(i=low;iai+1)aiai+1;change=1;high-; /修改上界for(i=high;ilow;i-) /從下向上起泡if(aiai-1)aiai-1;change=1;low+; /修改下界/while/Bubble_Sort2 10.28 void Bubble_Sort3(int a ,int n)/對上一題的算法進(jìn)行化簡,循環(huán)體中只包含一次冒泡int b 3 ; /b0為冒泡的下界,b 2 為上界,b1無用d=1;b0=0;b 2 =n-1; /d為冒泡方向的

6、標(biāo)識,1為向上,-1為向下change=1;while(b00) /注意這個(gè)交換條件aiai+d;change=1;b1+d-=d; /修改邊界d*=-1; /換個(gè)方向/while/Bubble_Sort3 10.29 void OE_Sort(int a ,int n)/奇偶交換排序的算法change=1;while(change) change=0;for(i=1;iai+1)aiai+1;change=1;for(i=0;iai+1)aiai+1;change=1;/while/OE_Sort 分析:本算法的結(jié)束條件是連續(xù)兩趟比較無交換發(fā)生10.30 typedef struct int

7、 low; int high; boundary; /子序列的上下界類型 void QSort_NotRecurve(int SQList &L)/快速排序的非遞歸算法low=1;high=L.length;InitStack(S); /S的元素為boundary類型while(low2) /如果當(dāng)前子序列長度大于3且尚未排好序pivot=Partition(L,low,high); /進(jìn)行一趟劃分if(high-pivotpivot-low)Push(S,pivot+1,high); /把長的子序列邊界入棧high=pivot-1; /短的子序列留待下次排序elsePush(S,low,pi

8、vot-1);low=pivot+1;/ifelse if(lowhigh&high-low3)/如果當(dāng)前子序列長度小于3且尚未排好序Easy_Sort(L,low,high); /直接進(jìn)行比較排序low=high; /當(dāng)前子序列標(biāo)志為已排好序else /如果當(dāng)前子序列已排好序但棧中還有未排序的子序列Pop(S,a); /從棧中取出一個(gè)子序列l(wèi)ow=a.low;high=a.high;/while/QSort_NotRecurve int Partition(SQList &L,int low,int high)/一趟劃分的算法,與書上相同L.r0=L.rlow;pivotkey=L.rlow

9、.key;while(lowhigh)while(low=pivotkey)high-;L.rlow=L.rhigh;while(lowhigh&L.rlow.keyL.rhigh.key) L.rlowL.rhigh;else /子序列含有三個(gè)元素if(L.rlow.keyL.rlow+1.key) L.rlowL.rlow+1;if(L.rlow+1.keyL.rhigh.key) L.rlow+1L.rhigh;if(L.rlow.keyL.rlow+1.key) L.rlowL.rlow+1;/Easy_Sort 10.31 void Divide(int a ,int n)/把數(shù)組a

10、中所有值為負(fù)的記錄調(diào)到非負(fù)的記錄之前l(fā)ow=0;high=n-1;while(lowhigh)while(low=0) high-; /以0作為虛擬的樞軸記錄alowahigh;while(lowhigh&alow0) low+;alowahigh;/Divide 10.32 typedef enum RED,WHITE,BLUE color; /三種顏色 void Flag_Arrange(color a ,int n)/把由三種顏色組成的序列重排為按照紅,白,藍(lán)的順序排列i=0;j=0;k=n-1;while(j=k)switch(aj)case RED:aiaj;i+;j+;break;

11、case WHITE:j+;break;case BLUE:ajak;k-; /這里沒有j+;語句是為了防止交換后aj仍為藍(lán)色的情況/Flag_Arrange分析:這個(gè)算法中設(shè)立了三個(gè)指針.其中,j表示當(dāng)前元素;i以前的元素全部為紅色;k以后的元素全部為藍(lán)色.這樣,就可以根據(jù)j的顏色,把其交換到序列的前部或者后部. 10.33 void LinkedList_Select_Sort(LinkedList &L)/單鏈表上的簡單選擇排序算法for(p=L;p-next-next;p=p-next)q=p-next;x=q-data;for(r=q,s=q;r-next;r=r-next) /在q

12、后面尋找元素值最小的結(jié)點(diǎn)if(r-next-datanext-data;s=r;if(s!=q) /找到了值比q-data更小的最小結(jié)點(diǎn)s-nextp-next=s-next;s-next=q;t=q-next;q-next=p-next-next;p-next-next=t; /交換q和s-next兩個(gè)結(jié)點(diǎn)/for/LinkedList_Select_Sort 10.34 void Build_Heap(Heap &H,int n)/從低下標(biāo)到高下標(biāo)逐個(gè)插入建堆的算法for(i=2;iH.rk.key)H.rjH.rk;j=k;/for/Build_Heap 10.35 void TriHe

13、ap_Sort(Heap &H)/利用三叉樹形式的堆進(jìn)行排序的算法for(i=H.length/3;i0;i-)Heap_Adjust(H,i,H.length);for(i=H.length;i1;i-)H.r1H.ri;Heap_Adjust(H,1,i-1);/TriHeap_Sort void Heap_Adjust(Heap &H,int s,int m)/順序表H中,H.rs+1到H.rm已經(jīng)是堆,把H.rs插入并調(diào)整成堆rc=H.rs;for(j=3*s-1;j=m;j=3*j-1)if(jm&H.rj.keyH.rj+1.key) j+;if(jm&H.rj.keyH.rj+1

14、.key) j+;H.rs=H.rj;s=j;H.rs=rc;/Heap_Adjust分析:本算法與課本上的堆排序算法相比,只有兩處改動(dòng):1.建初始堆時(shí),i的上限從H.length/3開始(為什么?) 2.調(diào)整堆的時(shí)候,要從結(jié)點(diǎn)的三個(gè)孩子結(jié)點(diǎn)中選擇最大的那一個(gè),最左邊的孩子的序號的計(jì)算公式為j=3*s-1(為什么?) 10.36 void Merge_Sort(int a ,int n)/歸并排序的非遞歸算法for(l=1;ln;l*=2) /l為一趟歸并段的段長for(i=0;(2*i-1)*l(n-1)?(n-1):(start2+l-1);/注意end2可能超出邊界Merge(a,sta

15、rt1,end1,start2,end2); /歸并/Merge_Sort void Merge(int a ,int s1,int e1,int s2,int e2)/將有序子序列as1到ae1和as2到ae2歸并為有序序列as1到ae2int bMAXSIZE; /設(shè)立輔助存儲(chǔ)數(shù)組bfor(i=s1,j=s2,k=s1;i=e1&j=e2;k+)if(aiaj) bk=ai+;else bk=aj+;while(i=e1) bk+=ai+;while(j=e2) bk+=aj+; /歸并到b中for(i=s1;i=e2;i+) /復(fù)制回去ai=bi;/Merge 10.37 void Li

16、nkedList_Merge_Sort1(LinkedList &L)/鏈表結(jié)構(gòu)上的歸并排序非遞歸算法for(l=1;lnext,e2=p;p-next;p=e2)for(i=1,q=p;inext;i+,q=q-next);e1=q;for(i=1;inext;i+,q=q-next);e2=q; /求出兩個(gè)待歸并子序列的尾指針if(e1!=e2) LinkedList_Merge(L,p,e1,e2); /歸并/LinkedList_Merge_Sort1 void LinkedList_Merge(LinkedList &L,LNode *p,LNode *e1,LNode *e2)/對

17、鏈表上的子序列進(jìn)行歸并,第一個(gè)子序列是從p-next到e1,第二個(gè)是從e1-next到e2q=p-next;r=e1-next; /q和r為兩個(gè)子序列的起始位置while(q!=e1-next&r!=e2-next)if(q-datadata) /選擇關(guān)鍵字較小的那個(gè)結(jié)點(diǎn)接在p的后面p-next=q;p=q;q=q-next;elsep-next=r;p=r;r=r-next;/whilewhile(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

18、10.38 void LinkedList_Merge_Sort2(LinkedList &L)/初始?xì)w并段為最大有序子序列的歸并排序,采用鏈表存儲(chǔ)結(jié)構(gòu)LNode *endMAXSIZE; /設(shè)立一個(gè)數(shù)組來存儲(chǔ)各有序子序列的尾指針for(p=L-next-next,i=0;p;p=p-next) /求各有序子序列的尾指針if(!p-next|p-datap-next-data) endi+=p;while(end0-next) /當(dāng)不止一個(gè)子序列時(shí)進(jìn)行兩兩歸并j=0;k=0; /j:當(dāng)前子序列尾指針存儲(chǔ)位置;k:歸并后的子序列尾指針存儲(chǔ)位置for(p=L-next,e2=p;p-next;p=

19、e2) /兩兩歸并所有子序列e1=endj;e2=endj+1; /確定兩個(gè)子序列if(e1-next) LinkedList_Merge(L,p,e1,e2); /歸并endk+=e2; /用新序列的尾指針取代原來的尾指針j+=2; /轉(zhuǎn)到后面兩個(gè)子序列/while/LinkedList_Merge_Sort2 void LinkedList_Merge(LinkedList &L,LNode *p,LNode *e1,LNode *e2)/對鏈表上的子序列進(jìn)行歸并,第一個(gè)子序列是從p-next到e1,第二個(gè)是從e1-next到e2q=p-next;r=e1-next;while(q!=e1

20、-next&r!=e2-next)if(q-datadata)p-next=q;p=q;q=q-next;elsep-next=r;p=r;r=r-next;/whilewhile(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且l12(l1+l2)的兩個(gè)有序子序列歸并為有序序列start1=0;start2=l1; /分別表示序列1和序列

21、2的剩余未歸并部分的起始位置for(i=0;il1;i+) /插入第i個(gè)元素for(j=start2;jl1+l2&ajastart1+i;j+); /尋找插入位置k=j-start2; /k為要向右循環(huán)移動(dòng)的位數(shù)RSh(a,start1,j-1,k);/將astart1到aj-1之間的子序列循環(huán)右移k位start1+=k+1;start2=j; /修改兩序列尚未歸并部分的起始位置/SL_Merge void RSh(int a ,int start,int end,int k)/將astart到aend之間的子序列循環(huán)右移k位,算法原理參見5.18len=end-start+1;for(i=

22、1;i=k;i+)if(len%i=0&k%i=0) p=i; /求len和k的最大公約數(shù)pfor(i=0;ip;i+) /對p個(gè)循環(huán)鏈分別進(jìn)行右移j=start+i;l=start+(i+k)%len;temp=aj;while(l!=start+i)aj=temp;temp=al;al=aj;j=l;l=start+(j-start+k)%len; /依次向右移astart+i=temp;/for/RSh 10.40 書后給出的解題思路在表述上存在問題,無法理解.比如說,把第一個(gè)序列劃分為兩個(gè)子序列,使其中的第一個(gè)子序列含有s1個(gè)記錄,0=s1s,第二個(gè)子序列有s個(gè)記錄.可是題目中并沒有說

23、明,第一個(gè)序列的長度2s.請會(huì)做的朋友提供解法. 10.41 void Hash_Sort(int a )/對1000個(gè)關(guān)鍵字為四位整數(shù)的記錄進(jìn)行排序int b10000;for(i=0;i1000;i+) /直接按關(guān)鍵字散列for(j=ai;bj;j=(j+1)%10000);bj=ai;for(i=0,j=0;i1000;j+) /將散列收回a中if(bj)for(x=bj,k=j;bk;k=(k+1)%10000)if(bk=x)ai+=x;bk=0;/if/Hash_Sort 10.42 typedef struct int gt; /大于該記錄的個(gè)數(shù) int lt; /小于該記錄的個(gè)

24、數(shù) place; /整個(gè)序列中比某個(gè)關(guān)鍵字大或小的記錄個(gè)數(shù) int Get_Mid(int a ,int n)/求一個(gè)序列的中值記錄的位置place bMAXSIZE;for(i=0;in;i+) /對每一個(gè)元素統(tǒng)計(jì)比它大和比它小的元素個(gè)數(shù)gt和ltfor(j=0;jai) bi.gt+;else if(ajai) bi.lt+;mid=0;min_dif=abs(b0.gt-b0.lt);for(i=0;in;i+) /找出gt值與lt值最接近的元素,即為中值記錄if(abs(bi.gt-bi.lt)min_dif) mid=i;return mid;/Get_Mid 10.43 void

25、Count_Sort(int a ,int n)/計(jì)數(shù)排序算法int cMAXSIZE;for(i=0;in;i+) /對每一個(gè)元素for(j=0,count=0;jn;j+) /統(tǒng)計(jì)關(guān)鍵字比它小的元素個(gè)數(shù)if(ajai) count+:ci=count;for(i=0;in;i+) /依次求出關(guān)鍵字最小,第二小,.,最大的記錄min=0;for(j=0;jn;j+)if(cjcmin) min=j; /求出最小記錄的下標(biāo)minaiamin; /與第i個(gè)記錄交換cmin=INFINITY; /修改該記錄的c值為無窮大以便下一次選取/Count_Sort 10.44 void Enum_Sort

26、(int a ,int n)/對關(guān)鍵字只能取v到w之間任意整數(shù)的序列進(jìn)行排序int numberw+1,posw+1;for(i=0;in;i+) numberai+; /計(jì)數(shù)for(pos0=0,i=1;in;i+)posi=posi-1+numi; /pos數(shù)組可以把關(guān)鍵字的值映射為元素在排好的序列中的位置for(i=0;in;i+) /構(gòu)造有序數(shù)組ccposai+=ai;for(i=0;in;i+)ai=ci;/Enum_Sort分析:本算法參考了第五章三元組稀疏矩陣轉(zhuǎn)置的算法思想,其中的pos數(shù)組和那里的cpot數(shù)組起的是相類似的作用. 10.45 typedef enum 0,1,2

27、,3,4,5,6,7,8,9 digit; /個(gè)位數(shù)類型typedef digit3 num; /3位自然數(shù)類型,假設(shè)低位存儲(chǔ)在低下標(biāo),高位存儲(chǔ)在高下標(biāo) void Enum_Radix_Sort(num a ,int n)/利用計(jì)數(shù)實(shí)現(xiàn)基數(shù)排序,其中關(guān)鍵字為3位自然數(shù),共有n個(gè)自然數(shù)int number ,pos ;num cMAXSIZE;for(j=0;j3;j+) /依次對個(gè)位,十位和百位排序for(i=0;in;i+) numberaij+; /計(jì)數(shù)for(pos0=0,i=1;in;i+)posi=posi-1+numi; /把關(guān)鍵字的值映射為元素在排好的序列中的位置for(i=0;

28、in;i+) /構(gòu)造有序數(shù)組ccposaij+=ai;for(i=0;in;i+)ai=ci;/for/Enum_Radix_Sort分析:計(jì)數(shù)排序是一種穩(wěn)定的排序方法.正因?yàn)槿绱?它才能夠被用來實(shí)現(xiàn)基數(shù)排序. 10.46 typedef struct int key; int pos; Shadow; /影子序列的記錄類型 void Shadow_Sort(Rectype b ,Rectype &a ,int n)/對元素很大的記錄序列b進(jìn)行排序,結(jié)果放入a中,不移動(dòng)元素Shadow dMAXSIZE;for(i=0;i1&change;i-) /對影子序列執(zhí)行冒泡排序change=0;for(j=0;jdj+1.key)djdj+1;change=1;/forfor(i=0;in;i+) /按照影子序列里記錄的原來位置復(fù)制原序列ai=bdi.pos;/Shadow_Sort

展開閱讀全文
溫馨提示:
1: 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
2: 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
3.本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
5. 裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

相關(guān)資源

更多
正為您匹配相似的精品文檔
關(guān)于我們 - 網(wǎng)站聲明 - 網(wǎng)站地圖 - 資源地圖 - 友情鏈接 - 網(wǎng)站客服 - 聯(lián)系我們

copyright@ 2023-2025  zhuangpeitu.com 裝配圖網(wǎng)版權(quán)所有   聯(lián)系電話:18123376007

備案號:ICP2024067431-1 川公網(wǎng)安備51140202000466號


本站為文檔C2C交易模式,即用戶上傳的文檔直接被用戶下載,本站只是中間服務(wù)平臺(tái),本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!