歡迎來到裝配圖網(wǎng)! | 幫助中心 裝配圖網(wǎng)zhuangpeitu.com!
裝配圖網(wǎng)
ImageVerifierCode 換一換
首頁 裝配圖網(wǎng) > 資源分類 > DOC文檔下載  

西北工業(yè)大學(xué)程序設(shè)計大作業(yè).doc

  • 資源ID:6613142       資源大?。?span id="9uvsjbn" class="font-tahoma">908.09KB        全文頁數(shù):19頁
  • 資源格式: DOC        下載積分:9.9積分
快捷下載 游客一鍵下載
會員登錄下載
微信登錄下載
三方登錄下載: 微信開放平臺登錄 支付寶登錄   QQ登錄   微博登錄  
二維碼
微信掃一掃登錄
下載資源需要9.9積分
郵箱/手機:
溫馨提示:
用戶名和密碼都是您填寫的郵箱或者手機號,方便查詢和重復(fù)下載(系統(tǒng)自動生成)
支付方式: 支付寶    微信支付   
驗證碼:   換一換

 
賬號:
密碼:
驗證碼:   換一換
  忘記密碼?
    
友情提示
2、PDF文件下載后,可能會被瀏覽器默認打開,此種情況可以點擊瀏覽器菜單,保存網(wǎng)頁到桌面,就可以正常下載了。
3、本站不支持迅雷下載,請使用電腦自帶的IE瀏覽器,或者360瀏覽器、谷歌瀏覽器下載即可。
4、本站資源下載后的文檔和圖紙-無水印,預(yù)覽文檔經(jīng)過壓縮,下載后原文更清晰。
5、試題試卷類文檔,如果標題沒有明確說明有答案則都視為沒有答案,請知曉。

西北工業(yè)大學(xué)程序設(shè)計大作業(yè).doc

學(xué) 院學(xué)院班 級學(xué) 號姓 名目錄1 摘要31.1 設(shè)計題目31.2 設(shè)計內(nèi)容31.3 開發(fā)工具31.4 應(yīng)用平臺32 詳細設(shè)計32.1 程序結(jié)構(gòu)32.2 主要功能42.3 函數(shù)實現(xiàn)52.4 開發(fā)日志73 程序調(diào)試及運行73.1 程序運行結(jié)果73.2 程序使用說明123.3 程序開發(fā)總結(jié)124 附件(源程序)121 摘要1.1 設(shè)計題目算法型大作業(yè)題目:編寫七種排序算法的演示程序。1.2 設(shè)計內(nèi)容編寫快速排序、插入排序、選擇排序、冒泡排序、堆排序、歸并排序、基數(shù)排序函數(shù),通過主函數(shù)調(diào)用以實現(xiàn)七種排序算法的演示。1.3 開發(fā)工具Visual C+ 6.01.4 應(yīng)用平臺Windows 2000/XP/Vista 32位2 詳細設(shè)計2.1 程序結(jié)構(gòu)程序的整體結(jié)構(gòu)與流程見下圖所示。程序運行時在主菜單中輸入序號選擇排序方法或選擇結(jié)束程序,當進行某種排序方法后,在主函數(shù)中輸入待排數(shù)據(jù)個數(shù)和待排數(shù)據(jù),通過調(diào)用對應(yīng)的排序函數(shù)實現(xiàn)排序并輸出。該排序結(jié)束后再次進入主函數(shù),通過循環(huán)重復(fù)上述操作。其中,主函數(shù)中將數(shù)組地址和待排序數(shù)據(jù)個數(shù)傳遞給排序函數(shù),在排序函數(shù)中實現(xiàn)排序功能。輸出排序結(jié)果開始快速插入選擇冒泡堆排歸并基數(shù)選擇排序方法進入主菜單退出系統(tǒng)2.2 主要功能函數(shù)的功能為對快速排序、插入排序、選擇排序、冒泡排序、堆排序、歸并排序、基數(shù)排序算法的演示。主函數(shù):程序運行時,可使運行者根據(jù)提醒輸入相關(guān)操作,從而進入不同的排序方法或者退出。快速排序函數(shù):根據(jù)快速排序的算法,最后輸出插入排序函數(shù):根據(jù)插入排序的算法,最后輸出選擇排序函數(shù):根據(jù)選擇排序的算法,最后輸出冒泡排序函數(shù):根據(jù)冒泡排序的算法,最后輸出堆排序函數(shù):根據(jù)堆排序的算法,最后輸出歸并排序函數(shù):根據(jù)歸并排序的算法,最后輸出基數(shù)排序函數(shù):根據(jù)基數(shù)排序的算法,最后輸出2.3 函數(shù)實現(xiàn)主函數(shù):在主函數(shù)中對菜單輸出,通過switch語句中的case分支選擇所需要的排序方法;通過while循環(huán)使演示程序在運行時能夠持續(xù)進行快速排序: 快速排序(kuaisu)又被稱做分區(qū)交換排序,這是一種平均性能非常好的排序方法。其算法基本思想是:任取排序表中的某個數(shù)據(jù)元素(例如取第一個數(shù)據(jù)元素)作為基準,按照該數(shù)據(jù)元素的關(guān)鍵字大小,將整個排序表劃分為左右兩個子表: 左側(cè)子表中所有數(shù)據(jù)元素的關(guān)鍵字都小于基準數(shù)據(jù)元素的關(guān)鍵字。右側(cè)子表中所有數(shù)據(jù)元素的關(guān)鍵字都大于或等于基準數(shù)據(jù)元素的關(guān)鍵字,基準數(shù)據(jù)元素則排在這兩個子表中間(這也是該數(shù)據(jù)元素最終應(yīng)安放的位置),然后分別對這兩個子表重復(fù)施行上述方法的快速排序,直到所有的子表長度為1,則排序結(jié)束。插入排序:插入排序(charu)的基本思想:開始時把第一個數(shù)據(jù)元素作為初始的有序序列,然后從第二個數(shù)據(jù)元素開始依次把數(shù)據(jù)元素按關(guān)鍵字大小插入到已排序的部分排序表的適當位置。當插入第i(1<i<=n)個數(shù)據(jù)元素時,前面的i-1個數(shù)據(jù)元素已經(jīng)排好序,這時,用第i個數(shù)據(jù)元素的關(guān)鍵字與前面的i-1個數(shù)據(jù)元素的關(guān)鍵字順序進行比較,找到插入位置后就將第i個數(shù)據(jù)元素插入。如此進行n-1次插入,就完成了排序。以下是在順序表上實現(xiàn)的直接插入排序在順序表上進行直接插入排序時,當插入第i(1<i<=n)個數(shù)據(jù)元素時,前面的A0、A1、Ai-2已經(jīng)排好序,這時,用Ai-1的關(guān)鍵字依次與Ai-2,Ai-3,的關(guān)鍵字順序進行比較,如果這些數(shù)據(jù)元素的關(guān)鍵字大于Ai-1的關(guān)鍵字,則將數(shù)據(jù)元素向后移一個位置,當找到插入位置后就將Ai-1插入,就完成了A0,A1,An-1的排序。選擇排序選擇排序(xuanze)的算法基本思想是:a)開始時設(shè)i的初始值為0。b)如果i<n-1,在數(shù)據(jù)元素序列Ai(An-1中,選出具有最小關(guān)鍵字的數(shù)據(jù)元素Ak;否則算法結(jié)束。c)若Ak不是這組數(shù)據(jù)元素中的第一個數(shù)據(jù)元素(ik),則將Ak與Ai這兩數(shù)據(jù)元素的位置對調(diào);d)令i=i+1轉(zhuǎn)步驟 b)。冒泡排序:冒泡排序(maopao) 的基本思想是:設(shè)排序表中有n個數(shù)據(jù)元素。首先對排序表中第一,二個數(shù)據(jù)元素的關(guān)鍵字A0和A1進行比較。如果前者大于后者,則進行交換;然后對第二,三個數(shù)據(jù)做同樣的處理;重復(fù)此過程直到處理完最后兩個相鄰的數(shù)據(jù)元素。我們稱之為一趟冒泡,它將關(guān)鍵字最大的元素移到排序表的最后一個位置,其他數(shù)據(jù)元素一般也都向排序的最終位置移動。然后進行第二趟排序,對排序表中前n-1個元素進行與上述同樣的操作,其結(jié)果使整個排序表中關(guān)鍵字次大的數(shù)據(jù)元素被移到An-2的位置。如此最多做n-1趟冒泡就能把所有數(shù)據(jù)元素排好序。堆排序:堆排序(duipai)sa.對排序表中的數(shù)據(jù)元素,利用堆的調(diào)整算法形成初始堆。b.輸出堆頂元素。c.對剩余元素重新調(diào)整形成堆。d.重復(fù)執(zhí)行第b、c步,直到所有數(shù)據(jù)元素被輸出。如果建立的堆滿足最大堆的條件,則堆的第一個數(shù)據(jù)元素A0具有最大的關(guān)鍵字,將A0與An-1對調(diào),把具有最大關(guān)鍵字的數(shù)據(jù)元素交換到最后,再對前面的n-1個數(shù)據(jù)元素使用堆的調(diào)整算法,重新建立最大堆,結(jié)果把具有次最大關(guān)鍵字的數(shù)據(jù)元素又上浮到堆頂,即A 0的位置,再對調(diào)A0和An-2,如此反復(fù)執(zhí)行n-1次,最后得到全部排序好的數(shù)據(jù)元素序列。歸并排序:其基本思想是:設(shè)有兩個有序表A和B,其數(shù)據(jù)元素個數(shù)(表長)分別為n和m,變量i和j分別是表A和表B的當前檢測指針;設(shè)表C是歸并后的新有序表,變量k是它的當前存放指針。開始時i、j、k都分別指向A、B、C三個表的起始位置;然后根據(jù)Ai與Bj的關(guān)鍵字的大小,把關(guān)鍵字小的數(shù)據(jù)元素放到新表Ck中;且相應(yīng)的檢測指針(i或j)和存放指針k增加1.如此循環(huán),當i與j中有一個已經(jīng)超出表長時,將另一個表中的剩余部分照抄到新表CkCm+n中。下面的歸并算法中,兩個待歸并的有序表首尾相接存放在數(shù)組sourcetable.arr中,其中第一個表的下標范圍從left到mid,另一個表的下標范圍從mid+1到right。前一個表中有mid-left+1個數(shù)據(jù)元素,后一個表中有right mid個數(shù)據(jù)元素。歸并后得到的新有序表有right mid個數(shù)據(jù)元素。歸并后得到的新有序表存放在另一個輔助數(shù)組mergedtable.arr中,其下標范圍從left到right。一趟歸并算法:設(shè)數(shù)組sourcetable.arr0到sourcetable.arrn-1中的n個數(shù)據(jù)元素已經(jīng)分為一些長度為len的歸并項,將這些歸并項兩兩歸并,歸并成一些長度為2len的歸并項,結(jié)果放到mergedtable.arr中。如果n不是2len的整數(shù)倍,則一趟歸并到最后,可能遇到兩種情況:剩下一個長度為len的歸并項和一個長度不足len的歸并項,可用一次merge算法,將它們歸并成一個長度小于2len的歸并項。只剩下一個歸并項,其長度小于或等于len,可將它直接復(fù)制到數(shù)組mergedtable.arr中。在一趟歸并算法的基礎(chǔ)上,實現(xiàn)兩路歸并排序算法。在兩路歸并排序算法中,初始排序表存放在數(shù)組table.arr中,第一趟歸并將table.arr中的歸并項兩兩歸并,結(jié)果存放在輔助數(shù)組temptable.arr中。第二趟將temptable.arr中的歸并項兩兩歸并,結(jié)果放回原數(shù)組table.arr中,如此反復(fù)進行。為了將最后歸并結(jié)果仍放在數(shù)組table.arr中,歸并趟數(shù)應(yīng)為偶數(shù)。如果做奇數(shù)趟就能完成時,最后還需要執(zhí)行一次一趟歸并過程,由于這時的歸并項長度len>=n,因此在則趟歸并中while循環(huán)不執(zhí)行,只做把temptable.arr中的數(shù)據(jù)元素復(fù)制到table.arr的工作?;鶖?shù)排序:“基數(shù)排序法”(radix sort)則是屬于“分配式排序”(distribution sort),基數(shù)排序法又稱“桶子法”(bucket sort)或bin sort,顧名思義,它是透過鍵值的部份資訊,將要排序的元素分配至某些“桶”中,藉以達到排序的作用,基數(shù)排序法是屬于穩(wěn)定性的排序,其時間復(fù)雜度為O (nlog(r)m),其中r為所采取的基數(shù),而m為堆數(shù),在某些時候,基數(shù)排序法的效率高于其它的比較性排序法。具體可以參看后面的代碼進行理解。其它:使用了stdlib頭文件里包含的系統(tǒng)函數(shù),包括清屏函數(shù)和運行時的暫停,增強了程序運行時的效果。2.4 開發(fā)日志在老師布置了大作業(yè)的題目后,我就把題目下載下來并進行分析已選擇合適的題目。經(jīng)過我的慎重考慮,選擇了算法型大作業(yè)題目中的編寫七種排序算法的演示程序,覺得自己有能力把這道題目很好完成。在認真分析連題目后,基本確定了整體的思路,但是其中有堆排序,歸并排序,基數(shù)排序我沒有在教材中接觸過,于是借助了圖書館和網(wǎng)絡(luò)上的資源,重點對這三的函數(shù)進行編寫。在編寫大作業(yè)過程中大的困難我沒有遇到,只是有些小的疏忽常常導(dǎo)致程序無法運行,如形參和實參的不一致等。我也在其中意識到對知識掌握的不夠熟練,在解決了這些問題后,我覺得自己對程序的編寫更加熟練了,對問題的分析也更加嚴謹了。在C程序設(shè)計的實驗和理論考試之前代碼已基本完成。在考試結(jié)束后,我又對程序稍微進行了修改,使之運行時效果更好。接著開始寫實驗報告,整理自己的大作業(yè)。我對我的作業(yè)是很滿意的。3 程序調(diào)試及運行3.1 程序運行結(jié)果1.進入程序運行后所顯示的菜單:2.快速排序:3.插入排序:4.選擇排序:5.冒泡排序:6.堆排序:7.歸并排序:8.基數(shù)排序:9.結(jié)束:3.2 程序使用說明1.打開源程序,調(diào)試完畢后開始運行,開始進行七種算法的演示;2.按照說明進行輸入,選擇數(shù)字17即可進入相應(yīng)的排序算法演示程序,選擇8結(jié)束程序;3.選擇排序的方法后,按要求輸入待排數(shù)據(jù)的個數(shù),然后輸入待排序數(shù)據(jù)即可(數(shù)據(jù)排序結(jié)束后,會自動清屏,進入菜單進行接下來的選擇);4.應(yīng)當注意,本演示程序?qū)?shù)據(jù)進行的是升序;3.3 程序開發(fā)總結(jié)在選擇這個題目時,我覺得難度系數(shù)10對我有挑戰(zhàn)性,并且我對排序有相對比較熟悉,所以就選了這個題目。但是在編寫過程中卻遇到很多問題。我和我的同學(xué)進行了討論,查閱了圖書館和網(wǎng)絡(luò)上的資料,結(jié)合力我個人對本題目的理解對各種問題進行了處理,學(xué)到了很多教材上沒有的知識。從這次實踐中,我意識到自己還有很多不足之處。能力也得到了提高。我在進行編程時還需要翻書查找,對于這一點,只能說對知識的學(xué)習還不夠扎實,所以有空時還應(yīng)該繼續(xù)熟悉這門課程。另外,就是對于錯誤的處理,不能得心應(yīng)手,不能正確處理一些簡單的錯誤。對于邏輯上的錯誤,不能夠立即找到出錯點,往往需要向同學(xué)請教才能找出錯誤,并且改正。我覺得這是自己獨自思考能力不高的問題,遇事需要自己仔細想想,若還不能改正,再請教別人也不遲。從總體上說,最終結(jié)果我很滿意,我覺得我所設(shè)計的程序操作方便,功能良好。我在上面花費了很多時間和精力,對作業(yè)不斷進行修改和完善,我很有成就感 。我的能力在這之中得到了提高。4 附件(源程序)# include<stdio.h># include<stdlib.h>/*快速排序*/void kuaisu(int A,int n)int i,j,k,t,p;for(i=0;i<n-1;i+)k=i;for(j=i+1;j<n;j+)if(Aj<Ak) k=j;t=Ak;Ak=Ai;Ai=t;printf("第%d趟:",i+1);for(p=0;p<n;p+)printf("%d ",Ap);printf("n");printf("n排序結(jié)果:");for(i=0;i<n;i+)printf("%d ",Ai);printf("n");printf("n");system("pause");system("CLS");/*插入排序*/void charu(int A,int n) int i,k,t,j,h=1;for(i=1;i<n;i+)t=Ai;k=i-1;while(t<Ak)Ak+1=Ak;k-;if(k=-1)break;printf("第%d趟:",h+);for(j=0;j<n;j+)printf("%d ",Aj);printf("n");Ak+1=t;printf("n排序結(jié)果:");for(i=0;i<n;i+)printf("%d ",Ai);printf("n");printf("n");system("pause");system("CLS");/*選擇排序*/void xuanze(int A,int n) int i,j,k,t,l,h=1;for(i=0;i<n-1;i+)k=i;for(j=i+1;j<n;j+)if(Aj<Ak) k=j;if(i!=k)t=Ai;Ai=Ak;Ak=t;printf("第%d趟:",h+);for(l=0;l<n;l+)printf("%d ",Al);printf("n");printf("n排序結(jié)果:");for(i=0;i<n;i+)printf("%d ",Ai);printf("n");printf("n");system("pause");system("CLS");/*冒泡排序*/void maopao(int A,int n) int i,j,t,h=1,p;for(j=0;j<n-1;j+)for(i=0;i<n-1-j;i+)if(Ai>Ai+1)t=Ai,Ai=Ai+1,Ai+1=t,p+;printf("第%d趟:",h+);for(p=0;p<n;p+)printf("%d ",Ap);printf("n");printf("n排序結(jié)果:");for(i=0;i<n;i+)printf("%d ",Ai);printf("n");printf("n");system("pause");system("CLS");/*堆排序*/void shift(int A , int i , int m) int k,t; t=Ai;k=2*i+1; while (k<m) if(k<m-1)&&(Ak<Ak+1) k+; if(t<Ak)Ai=Ak;i=k;k=2*i+1; else break; Ai=t;void duipai(int A , int n) /a 為排序數(shù)組,n為數(shù)組大小int i,k,h=1,j;for (i=n/2-1;i>=0;i-)shift(A,i,n); for (i=n-1;i>=1;i-)k=A0;A0=Ai;Ai=k;shift(A,0,i);printf("第%d趟:",h+);for(j=0;j<n;j+)printf("%d ",Aj);printf("n");printf("n排序結(jié)果:");for(i=0;i<n;i+)printf("%d ",Ai);printf("n");printf("n");system("pause");system("CLS");/*歸并排序*/void merge(int number,int first,int last,int mid) int number_temp10=0; int i=first,j=mid+1,k; for(k=0;k<=last-first;k+) if (i=mid+1) number_tempk=numberj+; continue; if (j=last+1) number_tempk=numberi+; continue; if (numberi<numberj) number_tempk=numberi+; else number_tempk=numberj+; for (i=first,j=0;i<=last;i+,j+) numberi = number_tempj;void merge_sort(int number,int first,int last) int mid=0; if(first<last) mid=(first+last)/2; merge_sort(number,first,mid); merge_sort(number,mid+1,last); merge(number,first,last,mid); void guibing(int a,int n)int i;merge_sort(a,0,n-1);printf("n排序結(jié)果:");for(i=0;i<n;i+) printf("%d ",ai);printf("n");printf("n");system("pause");system("CLS");/*基數(shù)排序*/void jishu(int data,int n)int temp1010=0; int order10=0; int i,j,k,q,lsd; k=0; q=1; while(q<=n) for(i=0;i<n;i+) lsd=(datai/q)%n); templsdorderlsd=datai; orderlsd+; for(i=0;i<n;i+) if(orderi != 0) for(j=0;j<orderi;j+) datak=tempij; k+; orderi = 0; q *= n; k = 0; printf("n排序結(jié)果:");for(i=0;i<n;i+)printf("%d ",datai);printf("n");printf("n");system("pause");system("CLS"); /*主函數(shù)*/ int main()int A100,p,n,i;while(1)printf("nt* 七種排序算法的演示程序 *n");printf("t* *n");printf("t* 1-快速排序 *n");printf("t* 2-插入排序 *n");printf("t* 3-選擇排序 *n");printf("t* 4-冒泡排序 *n");printf("t* 5- 堆排序 *n");printf("t* 6-歸并排序 *n");printf("t* 7-基數(shù)排序 *n");printf("t* 8-退出程序 *n");printf("t* *n");printf("t*nn");printf("請輸入序號進行選擇:n");scanf("%d",&p);if(p=8)break;printf("請輸入待排序數(shù)的個數(shù):n");scanf("%d",&n);printf("請輸入待排序數(shù)據(jù):n");for(i=0;i<n;i+)scanf("%d",&Ai);switch(p)case 1:kuaisu(A,n);break;case 2:charu(A,n);break;case 3:xuanze(A,n);break;case 4:maopao(A,n);break;case 5:duipai(A,n);break;case 6:guibing(A,n);break;case 7:jishu(A,n);break;printf("nntttt謝謝您的使用nn");return 0;Email:chengyunhemail.nwpu.edu.cn19

注意事項

本文(西北工業(yè)大學(xué)程序設(shè)計大作業(yè).doc)為本站會員(xin****828)主動上傳,裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。 若此文所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng)(點擊聯(lián)系客服),我們立即給予刪除!

溫馨提示:如果因為網(wǎng)速或其他原因下載失敗請重新下載,重復(fù)下載不扣分。




關(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ù)平臺,本站所有文檔下載所得的收益歸上傳人(含作者)所有。裝配圖網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對上載內(nèi)容本身不做任何修改或編輯。若文檔所含內(nèi)容侵犯了您的版權(quán)或隱私,請立即通知裝配圖網(wǎng),我們立即給予刪除!