




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
一、2-24試用棧來模擬遞歸,消去算法QuickSort中的尾遞歸,并比較消去尾遞歸前后算法的效率。1、解題說明快速排序的遞歸算法思路是,將整個(gè)數(shù)組以軸值為界限劃分為兩部分,然后分別最兩部分進(jìn)行快速排序。而用棧來模擬遞歸,其實(shí)就是用棧保存每一個(gè)待排序子串的首尾元素下表,下一次while循環(huán)的時(shí)候來,對這段子序列進(jìn)行partition操作??焖倥判虻乃惴ㄔ谏蠈W(xué)期的數(shù)據(jù)結(jié)構(gòu)中已經(jīng)學(xué)習(xí)過,只需對其中的qsort()函數(shù)中的遞歸部分進(jìn)行修改即可。調(diào)用庫函數(shù)計(jì)算程序運(yùn)行時(shí)間,并輸出,便于對比兩種算法的效率。2、代碼#include<iostream>#include<stack>#include<ctime>#include<cstdlib>#include<windows.h>usingnamespacestd;DWORDtake;int{findpivot(intA[],inti,intj)//找到軸值{srand(unsigned(time(0)));//取隨機(jī)數(shù)intpivot1=rand()%(j-i+1)+i;//取軸值}returnpivot1;voidswap(intA[],inti,intj) //交換{inttemp=A[i];A[i]=A[j];A[j]=temp;}intpartition(intA[],intl,intr,int&pivot)//分組{do{while(A[++l]<pivot); //將l右移while((r!=0)&&(A[--r]>pivot));//將r左移swap(A,l,r); //交換//多交換1//多交換1次,交換回來}//遞歸算法voidqsort(intA[],inti,intj) //快速排序{if(j<=i)return; //只剩一個(gè)元素的時(shí)候停止分組intpivotindex=findpivot(A,i,j); //獲取軸值swap(A,pivotindex,j); //將軸值放在最后intk=partition(A,i-1,j,A[j]); //右半部分的第一個(gè)值swap(A,k,j); //將軸值換回來qsort(A,i,k-1); //遞歸qsort(A,k+1,j);}//非遞歸算法voidqsort2(intA[],inti,intj){stack<int>st;if(j<=i)return; //只剩一個(gè)元素的時(shí)候停止分組intpivotindex二findpivot(A,i,j);//獲取軸值swap(A,pivotindex,j);//將軸值放在最后intk=partition(A,iT,j,A[j]);//右半部分的第一個(gè)值swap(A,k,j); //將軸值換回來if(i<k-1) //用棧保存每個(gè)待排序子串的首尾元素下標(biāo){st.push(i);st.push(k-1);}if(k+1<j){st.push(k+1);st.push(j);}while(!st.empty()){intq=st.top();st.pop();intp=st.top();st.pop();intpivotindex=findpivot(A,p,q);swap(A,pivotindex,q);intk=partition(A,p-1,q,A[q]);swap(A,k,q);if(p<k-1){st.push(p);st.push(k-1);}if(k+1<q){st.push(k+1);st.push(q);}}}intmain(){take=GetTickCount();intn;inttask[100];cout〈〈"請輸入待排序的數(shù)據(jù)個(gè)數(shù)n:"〈〈endl;cin>>n;cout〈〈"輸入數(shù)據(jù):"〈〈endl;for(inti=0;i〈n;i++)cin>>task[i];qsort(task,0,n-1);//qsort2(task,0,n-1);cout〈〈"排序結(jié)果為:"〈〈endl;for(intj=0;j〈n;j++)cout〈〈task[j]〈〈endl;cout〈〈"運(yùn)行時(shí)間為:"〈〈take〈〈endl;return0;3、運(yùn)行截圖非遞歸算法:I?F:\我的匚++程序\算法設(shè)計(jì)與分析\:請輸人待排序的數(shù)據(jù)個(gè)數(shù)屮爲(wèi)入數(shù)據(jù):32451排序結(jié)果為:12345_匡行時(shí)間為=19514882Press耳ny tocontinue遞歸算法:可以看出,非遞歸算法的運(yùn)算速度更快些,若數(shù)據(jù)個(gè)數(shù)增大,差距會更加明顯。4、遞歸與非遞歸效率對比理論來說,由于遞歸要層層調(diào)用,容易棧溢出,當(dāng)算法比較復(fù)雜的時(shí)候,效率也非常低,運(yùn)行起來等待結(jié)果時(shí)間很長。而用非遞歸,減少了函數(shù)調(diào)用開銷,可以解決溢出問題和效率低的問題。因?yàn)檫f歸算法使用的棧由程序自動產(chǎn)生,棧中包含函數(shù)調(diào)用時(shí)的參數(shù)和函數(shù)中的局部變量。如果局部變量很多或者函數(shù)內(nèi)部又調(diào)用了其他函數(shù),則棧會很大。每次遞歸調(diào)用都要操作很大的棧,效率自然會下降。而對于非遞歸算法,每次循環(huán)使用自己預(yù)先創(chuàng)建的棧,因此不管程序復(fù)雜度如何,都不會影響程序效率。二、2-2眾數(shù)問題問題描述:給定含有n個(gè)元素的多重集合S,每個(gè)元素在S中出現(xiàn)的次數(shù)稱為該元素的重?cái)?shù)。例如,S={1,2,2,2,3,5}。多重集S的眾數(shù)是2,其重?cái)?shù)為3。算法設(shè)計(jì):對于給定的由n個(gè)自然數(shù)組成的多重集S,計(jì)算S的眾數(shù)及其重?cái)?shù)。數(shù)據(jù)輸入:輸入數(shù)據(jù)由文件名為input.txt的文本文件提供。文件的第1行為多重集S中元素個(gè)數(shù)n;在接下來的n行中,每行有一個(gè)自然數(shù)。結(jié)果輸出:將計(jì)算結(jié)果輸出到文件output.txt。輸出文件有2行,第1行是眾數(shù),第2行是重?cái)?shù)。輸入文件示例 輸出文件示例input.txt output.txt6 232351、解題說明首先將文件中數(shù)據(jù)讀入到一個(gè)數(shù)組中,要想選擇眾數(shù),最基本的方法就是寫一個(gè)雙重for循環(huán),每一個(gè)元素跟數(shù)組中其他元素對比一遍,這樣時(shí)間復(fù)雜度是n的平方。改進(jìn)方案是先調(diào)用庫函數(shù)sort,對數(shù)組進(jìn)行排序,則只用一個(gè)for循環(huán)便可得到眾數(shù)和重?cái)?shù)。2、代碼#include<iostream>#include<algorithm>#include<fstream>usingnamespacestd;intmain(){intn,amount=1,maxamount=1,maxindex;ifstreamin("input.txt");ofstreamout("output.txt");in>>n;int*a=newint[n];for(inti=0;i<n;i++)ifstreamin("input.txt");ofstreamout("output.txt");in>>n;int*a=newint[n];for(inti=0;i<n;i++){in>>a[i];}sort(a,a+n);for(intj=1;j<n;j++){//從文件讀入元素個(gè)數(shù)//從文件讀入元素//對元素?cái)?shù)組進(jìn)行從小到大排序//循環(huán)記錄眾數(shù)下標(biāo)和其重?cái)?shù)if(a[j]==a[j-1])amount++;elseamount=1;if(amount>maxamount){maxamount=amount;maxindex=j;}//將輸出寫入文件中}out<<a[maxindex]<<endl<<maxamount<<endl;return0;//將輸出寫入文件中}3、程序運(yùn)行截圖input.txt:input.txt-本文聞窗日梧式output.txt:output.txt-記事本文件舊翱冏梧式必輸入輸出文件都在當(dāng)前目錄下:D曰buginput.txt一ou1tput.txteg金數(shù)問題ipp翁金數(shù)問題討年眾數(shù)問題皿b金數(shù)問題Qg三、2-10集合劃分問題對于給定正整數(shù)n,計(jì)算出n個(gè)元素的集合{1,2,…,n}可以劃分為多少個(gè)不同的非空子集。數(shù)據(jù)輸入:由文件input.txt提供輸入數(shù)據(jù)。文件的第1行是元素個(gè)數(shù)n。結(jié)果輸出:將計(jì)算出的不同的非空子集數(shù)輸出到文件output.txt。輸入文件示例 輸出文件示例input.txt output.txt5521、解題說明將n個(gè)元素劃分為m個(gè)集合的遞歸思路如下:把n個(gè)元素編號,對于第n個(gè)元素,有兩種情況,第一種是自己單獨(dú)是一個(gè)集合,等價(jià)于把前n-1個(gè)元素分成m-1份;第二種是第n個(gè)元素和別的元素一起組成了一個(gè)集合,等價(jià)于把前n-1個(gè)元素分成m份,然后把n號元素放入這m個(gè)集合中的一個(gè)(即有m中放法)。所以總數(shù)是:F(n,m)=F(n-1,m-1)+F(n-1,m)*m因此要求所有的集合,只需再用一個(gè)for循環(huán),將劃分大小從1循環(huán)到n即可。2、代碼#include<iostream>#include<fstream>usingnamespacestd;intpartition(intn,intm){if(m==1||m==n)return1;elsereturnpartition(n-1,m-1)+partition(n-1,m)*m;}intmain(){intn,sum=0;ifstreamin("input.txt");ofstreamout("output.txt");in>>n;for(inti=1;i<=n;i++){sum+=partition(n,i);}out<<sum<<endl;return0;}3、運(yùn)行截圖input.txtoutput.txtoutput.txt-1BW本文件㈢輛E)格式莎輸入輸出文件都存儲在當(dāng)前目錄下:Debug,,input.txt,,cutput.txteg集臺分問題叩p甸賓餓11分問題?擊p□集臺劃分問題.n比□集臺劃分問題Qpt□集臺劃分問題.pig四、數(shù)塔問題
輸入如下:第一行的數(shù)字代表數(shù)塔的層數(shù),接下來的數(shù)字為數(shù)塔中各層的結(jié)點(diǎn)中保存的數(shù)字L■8102744452651、解題說明這個(gè)題是典型的動態(tài)規(guī)劃問題,考慮的時(shí)候自頂向下的分析,自底向上的計(jì)算。從頂點(diǎn)出發(fā),向左走還是向右走取決于走哪邊最終總路徑和最大,只有兩條路徑的總長度最大值求出了才能做決策,一層一層推下去,直到倒數(shù)第二層,它選擇左還是右,只取決于哪個(gè)數(shù)更大些。所以實(shí)際求解的時(shí)候,可以從底層開始,層層往上推算,最后得到最大值。2、代碼#include<iostream>#include<fstream>usingnamespacestd;//求最大值函數(shù)intmax(inta,intb){//求最大值函數(shù)returna>b?a:b;}intmain(){inti,j,n,**a;ifstreamin("input.txt");ofstreamout("output.txt");in>>n;
a=newint*[n+1]; //創(chuàng)建二維數(shù)組存放數(shù)塔for(i=0;i<n+1;i++)a[i]=newint[n+1];for(i=1;i<n+1;i++) //從文件中讀取數(shù)塔中的數(shù)字,存放到二維數(shù)組中for(j=1;j<=i;j++)in>>a[i][j];for(i=n-1;i>=1;i--) //從倒數(shù)第二層開始,從下往上求最大值路徑for(j=1;j<=i;j++)a[i][j]
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025兒童醫(yī)院復(fù)合麻醉技術(shù)技能考核
- 2025年九江市江匯物流供應(yīng)鏈有限公司第二次公開招聘派遣制工作人員的考前自測高頻考點(diǎn)模擬試題及答案詳解(必刷)
- 2025人民醫(yī)院急危重癥救治能力考核
- 2025兒童醫(yī)院骨質(zhì)疏松治療藥物合理應(yīng)用考核
- 2025廣西玉林北流市山圍鎮(zhèn)衛(wèi)生院公開招聘5人考前自測高頻考點(diǎn)模擬試題及完整答案詳解一套
- 石家莊市中醫(yī)院術(shù)前準(zhǔn)備技能考核
- 重慶市人民醫(yī)院設(shè)備日常維護(hù)考核
- 重慶市人民醫(yī)院胸腰椎椎弓根螺釘置入精準(zhǔn)度考核
- 承德市人民醫(yī)院移植腎病理Banff分級應(yīng)用考核
- 2025年信陽浉河區(qū)招聘城市社區(qū)工作人員128人模擬試卷附答案詳解
- 1.2細(xì)胞的多樣性和統(tǒng)一性(1)課件-高一上學(xué)期生物人教版必修1
- Unit 1~2單元月考測試(含答案) 2025-2026學(xué)年譯林版(2024)八年級英語上冊
- 工程預(yù)算審核服務(wù)方案(3篇)
- 2025-2026學(xué)年七年級英語上學(xué)期第一次月考 (上海專用)原卷
- 2025年電梯培訓(xùn)考核題目及答案
- VTE課件講解教學(xué)課件
- 2024人教版七年級英語上冊 Unit7課時(shí)4SectionB(1a-1d)分層作業(yè)(含答案)
- 高原性肺水腫
- 2025年教科版小學(xué)三年級上冊《科學(xué)》第三單元第2課認(rèn)識氣溫計(jì)課件
- 平面直角坐標(biāo)系 課件 2025-2026學(xué)年北師大版數(shù)學(xué)八年級上冊
- 2025-2026學(xué)年北師大版(2024)小學(xué)數(shù)學(xué)二年級上冊教學(xué)計(jì)劃及進(jìn)度表
評論
0/150
提交評論