版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)報(bào)告</b></p><p> 課程設(shè)計(jì)題目: 綜合排序的設(shè)計(jì)</p><p> 2014年 12 月 13 日</p><p><b> 目錄</b></p><p><b> 摘要2</b></p><p&
2、gt; 一、題目的內(nèi)容及要求-------------------------------------------------------------------------------4</p><p> 二、需求分析--------------------------------------------------------------------------------------------4<
3、;/p><p> 三、概要設(shè)計(jì)--------------------------------------------------------------------------------------------5</p><p> 四、四種排序源代碼詳細(xì)設(shè)計(jì)-----------------------------------------------------------------
4、-----5</p><p> 五、程序輸出的結(jié)果---------------------------------------------------------------------------------10</p><p> 六、運(yùn)行結(jié)果及分析-------------------------------------------------------------------
5、--------------12</p><p> 七、收獲及體會(huì)---------------------------------------------------------------------------------------13</p><p> 八、參考文獻(xiàn)--------------------------------------------------------
6、-----------------------------------14</p><p><b> 摘 要</b></p><p> 數(shù)據(jù)結(jié)構(gòu)是由數(shù)據(jù)元素依據(jù)某種邏輯聯(lián)系組織起來(lái)的。對(duì)數(shù)據(jù)元素間邏輯關(guān)系的描述稱為數(shù)據(jù)的邏輯結(jié)構(gòu);數(shù)據(jù)必須在計(jì)算機(jī)內(nèi)存儲(chǔ),數(shù)據(jù)的存儲(chǔ)結(jié)構(gòu)是數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)形式,是其在計(jì)算機(jī)內(nèi)的表示;此外討論一個(gè)數(shù)據(jù)結(jié)構(gòu)必須同時(shí)討論在該類數(shù)據(jù)上執(zhí)行的運(yùn)
7、算才有意義。在許多類型的程序的設(shè)計(jì)中,數(shù)據(jù)結(jié)構(gòu)的選擇是一個(gè)基本的設(shè)計(jì)考慮因素。許多大型系統(tǒng)的構(gòu)造經(jīng)驗(yàn)表明,系統(tǒng)實(shí)現(xiàn)的困難程度和系統(tǒng)構(gòu)造的質(zhì)量都嚴(yán)重的依賴于是否選擇了最優(yōu)的數(shù)據(jù)結(jié)構(gòu)。許多時(shí)候,確定了數(shù)據(jù)結(jié)構(gòu)后,算法就容易得到了。有些時(shí)候事情也會(huì)反過來(lái),我們根據(jù)特定算法來(lái)選擇數(shù)據(jù)結(jié)構(gòu)與之適應(yīng)。不論哪種情況,選擇合適的數(shù)據(jù)結(jié)構(gòu)都是非常重要的。排序算法是數(shù)據(jù)結(jié)構(gòu)學(xué)科經(jīng)典的內(nèi)容,其中內(nèi)部排序現(xiàn)有的算法有很多種,其中包含冒泡排序,直接插入排序,簡(jiǎn)單
8、選擇排序,希爾排序,快速排序,堆排序等,各有其特點(diǎn)。對(duì)排序算法比較的分析可以遵循若干種不同的準(zhǔn)則,通常以排序過程所需要的算法步數(shù)作為度量,有時(shí)也以排序過程中所作的鍵比較次數(shù)作為度量。特別是當(dāng)作一次鍵比較需要較長(zhǎng)時(shí)間,例如,當(dāng)鍵是較長(zhǎng)的字符串時(shí),常以鍵比較次數(shù)作為排序算法計(jì)算時(shí)間復(fù)雜性的度量。當(dāng)排序時(shí)需要移動(dòng)記錄,且記錄都很大時(shí),還</p><p> 關(guān)鍵字:數(shù)據(jù)結(jié)構(gòu);算法比較;比較次數(shù);時(shí)間復(fù)雜度</p&
9、gt;<p> 一、題目的內(nèi)容及要求</p><p><b> 排序綜合</b></p><p> 利用隨機(jī)函數(shù)產(chǎn)生N個(gè)隨機(jī)整數(shù)(20000以上),對(duì)這些數(shù)進(jìn)行多種方法進(jìn)行排序。</p><p><b> 要求:</b></p><p> (1)至少采用三種方法實(shí)現(xiàn)上述問題求
10、解(提示,可采用的方法有插入排序、希爾排序、起泡排序、快速排序、選擇排序、堆排序、歸并排序)。并把排序后的結(jié)果保存在不同的文件中。</p><p> (2)統(tǒng)計(jì)每一種排序方法的性能(以上機(jī)運(yùn)行程序所花費(fèi)的時(shí)間為準(zhǔn)進(jìn)行對(duì)比),找出其中兩種較快的方法。</p><p> (3)如果采用4種或4種以上的方法者,可適當(dāng)加分。</p><p><b> 二、需
11、求分析</b></p><p> 2.1 問題描述 </p><p> 此次的任務(wù)要求是輸入20000個(gè)以上的隨機(jī)整數(shù),對(duì)這些數(shù)進(jìn)行多種方法進(jìn)行排序。(提示,可采用的方法有插入排序、希爾排序、起泡排序、快速排序、選擇排序、堆排序、歸并排序)。 約束:程序可由用戶自行設(shè)定排序數(shù)的個(gè)數(shù),但排序數(shù)具體值需要由計(jì)算機(jī)生成,然后用三種以上的排序方法對(duì)隨機(jī)數(shù)組進(jìn)行排序,每一種
12、排序方法執(zhí)行后需統(tǒng)計(jì)出數(shù)據(jù)移動(dòng)次數(shù)以判斷排序方法的對(duì)比隨機(jī)數(shù)組的執(zhí)行優(yōu)劣性。另:用戶自行算出每一種排序方法的時(shí)間復(fù)雜度與空間復(fù)雜度。 </p><p><b> 2.2 基本要求</b></p><p> 2.2.1輸入的形式和輸入值的范圍;</p><p> 設(shè)定的隨機(jī)數(shù)據(jù)的范圍為20000以上,用戶自定義隨機(jī)數(shù)的個(gè)數(shù)n,隨機(jī)數(shù)的數(shù)據(jù)類
13、型均為整形。</p><p> 2.2.2輸出的形式;</p><p> 程序是以一個(gè)完整的有序數(shù)組來(lái)進(jìn)行輸出。</p><p> 2.2.3程序所達(dá)到的功能:</p><p> 將一個(gè)無(wú)序數(shù)組進(jìn)行排序隨機(jī)生成20000以上個(gè)隨機(jī)整數(shù),對(duì)這些數(shù)進(jìn)行多種方法進(jìn)行排序。分別采用以下方法實(shí)現(xiàn)上述問題求解(可采用的方法有簡(jiǎn)單排序、希爾排序、冒
14、泡排序、快速排序這四種排序方法)。</p><p><b> 三、概要設(shè)計(jì)</b></p><p> 3.1可排序表的抽象數(shù)據(jù)類型定義:</p><p> typedef int KeyType; //關(guān)鍵字為整型</p><p> typedef int OtherType; //關(guān)鍵字為整型</p>
15、;<p> typedef struct</p><p><b> {</b></p><p> KeyType key; //關(guān)鍵字為KeyType型</p><p> OtherType other_data;</p><p> }RecordType; //定義一個(gè)RecordType型結(jié)構(gòu)
16、體,存放關(guān)鍵字</p><p> void quicksort(RecordType a[],int left,int right)//快速排序</p><p> void bubbleSort(RecordType a[],int length)//冒泡排序</p><p> void shellSort(RecordType a[],int n)//
17、希爾排序</p><p> void BinSort (RecordType r[], int length)//折半插入排序</p><p> void main()//主函數(shù)運(yùn)行入口</p><p> 四、四種排序源代碼詳細(xì)設(shè)計(jì):</p><p> 4.1快速排序模塊:</p><p> void
18、 quicksort(RecordType a[],int left,int right)</p><p><b> {</b></p><p> RecordType t;</p><p> int i,j,temp;</p><p> if(left>right)</p><p>
19、;<b> return;</b></p><p> temp=a[left].key;</p><p><b> i=left;</b></p><p><b> j=right;</b></p><p> while(i!=j)</p><p&
20、gt;<b> {</b></p><p> while(a[j].key>=temp && i<j)</p><p><b> j--;</b></p><p> while(a[i].key<=temp && i<j)</p><p&g
21、t;<b> i++;</b></p><p><b> if(i<j)</b></p><p><b> {</b></p><p><b> t=a[i];</b></p><p> a[i]=a[j];</p><
22、p><b> a[j]=t;</b></p><p><b> }</b></p><p><b> }</b></p><p> a[left] = a[i];</p><p> a[i].key = temp;</p><p> q
23、uicksort(a,left,i-1);//繼續(xù)處理左邊的,這是一個(gè)遞歸的過程</p><p> quicksort(a,i+1,right);//繼續(xù)處理右邊的,這是一個(gè)遞歸的過程</p><p> } /* 快速排序算法 */</p><p> 4.2冒泡排序模塊:</p><p> //此處是一次冒泡排序過程,在主函數(shù)中會(huì)通過
24、循環(huán)調(diào)用此冒泡函數(shù)過程</p><p> void bubbleSort(RecordType a[],int length)</p><p><b> {</b></p><p> int i,temp;</p><p> for(i=1;i<length;i++)</p><p>
25、;<b> {</b></p><p> if(a[i].key>a[i+1].key)</p><p><b> {</b></p><p> temp = a[i].key;</p><p> a[i].key=a[i+1].key;</p><p>
26、a[i+1].key=temp;</p><p><b> }</b></p><p><b> }</b></p><p> }/* 冒泡排序算法 */ </p><p> 4.3希爾排序模塊:</p><p> void shellSort(RecordType
27、 a[],int n)</p><p><b> {</b></p><p> int i, j, temp; </p><p> int gap = 0;</p><p> while (gap<=n)//根據(jù)待排序的個(gè)數(shù)生成合適的步長(zhǎng),gap是步長(zhǎng)</p><p><b&g
28、t; {</b></p><p> gap = gap * 3 + 1;</p><p><b> } </b></p><p> while (gap > 0) </p><p><b> {</b></p><p> for ( i = ga
29、p; i < n; i++ )</p><p><b> {</b></p><p> j = i - gap;</p><p> temp = a[i+1].key; </p><p> while (( j >= 0 ) && ( a[j+1].key >
30、 temp ))</p><p><b> {</b></p><p> a[j + gap+1].key = a[j+1].key;</p><p> j = j - gap;</p><p><b> }</b></p><p> a[j+gap+1].key
31、= temp;</p><p><b> }</b></p><p> gap = ( gap - 1 ) / 3;</p><p><b> }</b></p><p><b> } </b></p><p> 4.4希爾折半插入排序模塊:&
32、lt;/p><p> /*折半插入排序法*/</p><p> void BinSort (RecordType r[], int length)</p><p> /*對(duì)記錄數(shù)組r進(jìn)行折半插入排序,length為數(shù)組的長(zhǎng)度*/</p><p><b> {</b></p><p>
33、<b> int i,j;</b></p><p> RecordType x;</p><p> int low,high,mid;</p><p> for ( i=2; i<=length ; ++i ) </p><p><b> {</b></p><
34、p><b> x= r[i];</b></p><p> low=1; high=i-1;</p><p> while (low<=high ) /* 確定插入位置*/ </p><p><b> {</b></p><p> mid=(l
35、ow+high) / 2;</p><p> if ( x.key< r[mid].key ) </p><p> high=mid-1;</p><p><b> else </b></p><p> low=mid+1;</p><p><b> }<
36、;/b></p><p> for ( j=i-1 ; j>= low; --j ) r[j+1]= r[j]; /* 記錄依次向后移動(dòng) */ </p><p> r[low]=x; /* 插入記錄 */ </p><p>
37、;<b> }</b></p><p> }/*BinSort*/</p><p><b> 4.5主函數(shù)模塊:</b></p><p> void main()</p><p><b> {</b></p><p> int n,i,j,t
38、; </p><p><b> char b; </b></p><p> bool q=false;</p><p> RecordType a[40000];</p><p><b> while(1) </b></p><p><b> { <
39、;/b></p><p> printf("\n\n");</p><p> printf(" ************** 綜合排序*****************************\n\n"); </p><p> printf(" *************
40、********菜 單***************************\n\n"); </p><p> printf(" * ======================================================= * \n"); </p><p> printf(" *
41、 1. 讀 取 待排序長(zhǎng)度 * \n"); </p><p> printf(" * 2. 產(chǎn)生隨機(jī)數(shù)并輸出 * \n"); </p><p> printf(" *
42、 3. 采用快速排序法排序 * \n"); </p><p> printf(" * 4. 采用冒泡排序法排序 * \n"); </p><p> printf(" *
43、 5. 采用希爾排序法排序 * \n"); </p><p> printf(" * 6. 采用折半插入排序法排序 * \n"); </p><p> printf(" * 7.
44、 輸 出 * \n");</p><p> printf(" * 0. 退 出 系 統(tǒng) * \n");</p><p> printf(" * --------------
45、----------------------------------------- * \n");</p><p> printf(" 請(qǐng)輸入你要進(jìn)行的操作"); </p><p> b = getch(); </p><p> switch(b) </p><p><b>
46、{ </b></p><p> case '1': </p><p> printf("%c\n",b);</p><p> printf("請(qǐng)輸入待排序記錄的長(zhǎng)度:");</p><p> scanf("%d",&n);break; &
47、lt;/p><p><b> case '2':</b></p><p> printf("%c\n",b);</p><p> srand( (unsigned)time( NULL ));</p><p> printf("下面隨機(jī)生成%d個(gè)數(shù)字存儲(chǔ)在數(shù)組中\(zhòng)n&qu
48、ot;,n);</p><p> for(i=1;i<=n;i++)</p><p><b> {</b></p><p> a[i].key = rand()%20000;</p><p> printf("%d\t",a[i].key);</p><p>
49、if(i%100==0)</p><p> printf("\n");</p><p><b> }</b></p><p> printf("\n");</p><p><b> break;</b></p><p><
50、b> case '3':</b></p><p> printf("%c\n",b);</p><p> printf("\n-----------------快速排序結(jié)束-------------------\n\n");</p><p> quicksort(a,1,n
51、);</p><p> q=true;break;</p><p><b> case '4':</b></p><p> printf("%c\n",b);</p><p> for(i=0;i<n-1;i++)</p><p><b>
52、; {</b></p><p> bubbleSort(a,n-i);</p><p><b> }</b></p><p> printf("\n-----------------冒泡排序結(jié)束-------------------\n\n");</p><p> q
53、=true;break; </p><p><b> case '5':</b></p><p> printf("%c\n",b);</p><p> printf("\n-----------------希爾排序結(jié)束-------------------\n\n");
54、</p><p> shellSort(a,n);</p><p> q=true;break; </p><p><b> case '6':</b></p><p> printf("%c\n",b);</p><p> BinSort(a,n)
55、;</p><p> printf("\n-----------------折半插入排序結(jié)束-------------------\n\n");</p><p> q=true;break; </p><p><b> case '7':</b></p><p>
56、printf("%c\n",b);</p><p><b> if(q)</b></p><p><b> {</b></p><p> printf("\n-----------------排序后輸出-------------------\n");</p&g
57、t;<p> for(i=1;i<=n;i++)</p><p><b> {</b></p><p> printf("%d\t",a[i].key);</p><p> if(i%100==0)</p><p> printf("\n");<
58、/p><p><b> } </b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> printf("\n * =
59、====================================================== * \n"); </p><p> printf(" * 您未對(duì)待排序數(shù)據(jù)排序 * \n"); </p><p> printf(" *
60、 請(qǐng)重新選擇排序的序號(hào) * \n"); </p><p> printf(" * ------------------------------------------------------- * \n");</p><p><b> }</b>&
61、lt;/p><p><b> break; </b></p><p><b> case '0':</b></p><p> printf("%c\n",b);</p><p> printf("\n 感謝使用綜合排序程序\n
62、 按任意鍵退出......\n");</p><p> return;break; </p><p> default:printf("輸入錯(cuò)誤請(qǐng)重新輸入\n\n");</p><p><b> }</b></p><p><b> } </b></p
63、><p><b> }</b></p><p> 五、程序輸出的結(jié)果:</p><p><b> 5.1輸入和輸出:</b></p><p> (1)主函數(shù)運(yùn)行的輸出結(jié)果:</p><p> (2)選擇1,讀取待排序長(zhǎng)度(這里以20000為例):</p>
64、<p> (3)選擇2,產(chǎn)生隨機(jī)數(shù)并輸出:</p><p> (4)選擇3,采用快速排序法排序:</p><p> ?。ㄟx擇4、5、6的其他排序法的輸出雷同,此處就不再重復(fù))</p><p> (5)選擇7,輸出排序結(jié)果:</p><p><b> 六、運(yùn)行結(jié)果及分析</b></p>&l
65、t;p> 6.1各算法的比較方法</p><p><b> 1.穩(wěn)定性比較</b></p><p> 折半插入排序、冒泡排序是穩(wěn)定的</p><p> 希爾排序、快速排序是不穩(wěn)定的</p><p><b> 2.時(shí)間復(fù)雜性比較</b></p><p> 折半
66、插入排序、冒泡排序的時(shí)間復(fù)雜性為O(n2)</p><p> 其它非線形排序的時(shí)間復(fù)雜性為O(nlog2n)</p><p><b> 3.輔助空間的比較</b></p><p> 線形排序的輔助空間為O(n),其它排序的輔助空間為O(1);</p><p><b> 4.其它比較</b>&
67、lt;/p><p> 插入、冒泡排序的速度較慢,但參加排序的序列局部或整體有序時(shí),這種排序能達(dá)到較快的速度。</p><p> 反而在這種情況下,快速排序反而慢了。</p><p> 當(dāng)n較小時(shí),對(duì)穩(wěn)定性不作要求時(shí)宜用選擇排序,對(duì)穩(wěn)定性有要求時(shí)宜用插入或冒泡排序。</p><p> 當(dāng)n較大時(shí),關(guān)鍵字元素比較隨機(jī),對(duì)穩(wěn)定性沒要求宜用快速排
68、序。</p><p><b> 七、收獲及體會(huì)</b></p><p> 根據(jù)四種排序法的基礎(chǔ)理論實(shí)際性模仿和編寫算法程序,很是困難,算法是程序的靈魂,數(shù)據(jù)結(jié)構(gòu)確是算法的基礎(chǔ),但是不斷的實(shí)踐也是一種進(jìn)步的好途徑。這次課程設(shè)計(jì)主要是對(duì)基礎(chǔ)知識(shí)的靈活應(yīng)用,這就讓我進(jìn)一步提高了對(duì)數(shù)結(jié)構(gòu)知識(shí)的鞏固。這次設(shè)計(jì)的完成,困難是少不了的,還有很多其它的難題讓我都不知道所措,但是通
69、過努力最終解決他們讓我體會(huì)到成就感,更重要的是我的能力在實(shí)踐中得到了提升和優(yōu)化,特別是對(duì)常用的排序算法的應(yīng)用,這對(duì)我以后從事軟件應(yīng)用程序開發(fā)是有很大的幫助的。這次課程設(shè)計(jì)的心得體會(huì)通過實(shí)習(xí)我的收獲如下1、鞏固和加深了對(duì)數(shù)據(jù)結(jié)構(gòu)的理解,提高綜合運(yùn)用本課程所學(xué)知識(shí)的能力。2、培養(yǎng)了我選用參考書,查閱手冊(cè)及文獻(xiàn)資料的能力。培養(yǎng)獨(dú)立思考,深入研究,分析問題、解決問題的能力。3、通過實(shí)際編譯系統(tǒng)的分析設(shè)計(jì)、編程調(diào)試,掌握應(yīng)用軟件的分析方法和工程設(shè)
70、計(jì)方法。4、通過課程設(shè)計(jì),培養(yǎng)了我嚴(yán)肅認(rèn)真的工作作風(fēng),逐步建立正確的生產(chǎn)觀念、經(jīng)濟(jì)觀念和全局觀念。根據(jù)我在實(shí)習(xí)中遇到得問題,我將在以后的學(xué)習(xí)過程中注意以下幾點(diǎn): 1、認(rèn)真上好專業(yè)實(shí)驗(yàn)課,多在實(shí)踐中鍛煉自己。2、寫程序的過程中要考慮周到,嚴(yán)密。3、在做設(shè)計(jì)的時(shí)候要有</p><p><b> 八、參考文獻(xiàn)</b></p><p> [1] 啊哈磊,《啊哈!算法》
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)—綜合排序的設(shè)計(jì)
- 數(shù)據(jù)結(jié)構(gòu)排序綜合課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)排序綜合課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)排序綜合課程設(shè)計(jì)報(bào)告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--排序算法
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)報(bào)告--排序
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---希爾排序,冒泡排序,快速排序
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--冒泡排序法
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---排序算法比較
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--排序算法比較
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--內(nèi)部排序演示
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---排序算法的實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--排序算法演示系統(tǒng)
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)---撲克牌排序
- 拓?fù)渑判?算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì))
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--內(nèi)部排序算法的比較
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--幾種排序算法的演示
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計(jì)----huffman編碼
評(píng)論
0/150
提交評(píng)論