資料結構課程設計實驗報告心得體會C

2021-03-04 02:32:27 字數 5147 閱讀 9348

排序演算法比較分析

專業班級:08軟體工程2班

姓名: 汪偉

學號: 08010***xx

設計時間: 2010-9-15—-2010-9-27

指導教師: 楊薇薇

課程設計報告的內容

一、題目:排序演算法比較

1、 設計目的

1. 掌握各種排序的基本思想。

2. 掌握各種排序方法的演算法實現。

3. 掌握各種排序方法的優劣分析及花費的時間的計算。

4. 掌握各種排序方法所適應的不同場合。

2、 設計內容和要求

利用隨機函式產生30000個隨機整數,利用插入排序、起泡排序、選擇排序、快速排序、堆排序、歸併排序等排序方法進行排序,並統計每一種排序上機所花費的時間

二、 執行環境(軟、硬體環境)

軟體環境:vc6.0程式設計軟體

執行平台: win32

硬體: 普通個人pc機

三、 演算法設計的思想

1、氣泡排序:bubblesort()

基本思想: 設待排序的檔案為r[1..n]

第1趟(遍):從r[1]開始,依次比較兩個相鄰記錄的關鍵字

r[i].key和r[i+1].key,若r[i].key>r[i+1].key,則交換記錄

r[i]和r[i+1]的位置;否則,不交換。

(i=1,2,...n-1)

第1趟之後,n個關鍵字中最大的記錄移到了r[n]的位置上。

第2趟:從r[1]開始,依次比較兩個相鄰記錄的關鍵字

r[i].key和r[i+1].key,若r[i].key>r[i+1].key,則交換記錄

r[i]和r[i+1]的位置;否則,不交換。

(i=1,2,...n-2)

第2趟之後,前n-1個關鍵字中最大的記錄移到了r[n-1]的位

置上,作完n-1趟,或者不需再交換記錄時為止。

2、選擇排序:selsort()

每一趟從待排序的資料元素中選出最小(或最大)的乙個元素,順序放在已排好序的數列的最後,直到全部待排序的資料元素排完。

選擇排序不像氣泡排序演算法那樣先並不急於調換位置,第一輪(k=1)先從array[k]開始逐個檢查,看哪個數最小就記下該數所在的位置於minlindex中,等一輪掃瞄完畢,如果找到比array[k-1]更小的元素,則把array[minlindex]和a[k-1]對調,這時array[k]到最後乙個元素中最小的元素就換到了array[k-1]的位置。 如此反覆進行第二輪、第三輪…直到迴圈至最後一元素

3、直接插入排序 :inssort()

在已經排好序的序列中查詢待插入的元素的插入位置,並將待插入元素插入到有序列表中的過程。

將陣列分成兩部分,初始化時,前部分陣列為只有第乙個元素,用來儲存已排序元素,我們這裡叫 arr1 ;後部分陣列的元素為除第乙個元素的所有元素,為待排序或待插入元素,我們這裡叫 arr2 。

排序時使用二層迴圈:第一層對 arr2 進行迴圈,每次取後部分陣列(待排序陣列)裡的第乙個元素(我們稱為待排序元素或稱待插入元素) e1 ,然後在第二層迴圈中對 arr1 (已排好序的陣列)從第乙個元素往後進行迴圈,查到第乙個大於待插入元素(如果是公升序排列)或第乙個小於待插入元素(如果是降序排列) e2 ,然後對 arr1 從 e2 元素開始往後的所有元素向後移,最後把 e1 插入到原來 e2 所在的位置。這樣反覆地對 arr2 進行迴圈,直到 arr2 中所有的待插入的元素都插入到 arr1 中。

4、快序排序:quicksort()

基本思想:首先在r[1..n]中,確定乙個r[i],經過比較和

移動,將r[i]放到"中間"某個位置上,使得r[i]左邊所有記錄

的關鍵字小於等於r[i].key,r[i]右邊所有記錄的關鍵字大於等

於r[i].key。以r[i]為界,將檔案劃分為左、右兩個子檔案。

用同樣的方法分別對這兩個子檔案進行劃分, 得到4個更小

的子檔案。繼續進行下去,使得每個子檔案只有乙個記錄為止,

便得到原檔案的有序檔案。

例. 給定檔案(20,05,37,08,63,12,59,15,44,08),選

用第1個元素20進行劃分:

5、歸併排序:megesort()

假定檔案(r[1],r[2],...,r[n])中記錄是隨機排列的,進行

2-路歸併排序,首先把它劃分為長度均為1的n個有序子檔案,

然後對它們逐步進行2-路歸併排序。其步驟如下:

第1趟:從r[1..n]中的第1個和第2個有序子檔案開始,呼叫

演算法merge,每次歸併兩個相鄰子檔案,歸併結果放到y[1..n]中。

在y中形成 n/2 個長度為2的有序子檔案。若n為奇數,則y中最

後乙個子檔案的長度為1。

第2趟:把y[1..n]看作輸入檔案,將 n/2 個有序子檔案兩

兩歸併,歸併結果回送到r[1..n]中,在r中形成 n/2 /2 個長度為4的有序子檔案。若y中有奇數個子檔案,則r中最後乙個子文

件的長度為2。

共計經過 log2n 趟歸併,最後得到n個記錄的有序檔案。

6、堆排序:heapsort()

堆實質上是滿足如下性質的完全二叉樹:樹中任一非葉結點的關鍵字均不大於(或不小於)其左右孩子(若存在)結點的關鍵字。

1、n(n>1)個節點的的完全二叉樹從層次從左自右編號,最後乙個分枝節點(非葉子節點)的編號為 n/2 取整。2、且對於編號 i(1<=i<=n)有:父節點為 i/2 向下取整;若2i>n,則節點i沒有左孩子,否則其左孩子為2i;若2i+1>n,則沒有右孩子,否則其右孩子為2i+1。

3、這裡使用完全二叉樹只是為了好描述演算法,它只是一種邏輯結構,真真在實現時我們還是使用陣列來儲存這棵二叉樹的,因為完全二叉樹完全可以使用陣列來儲存。

堆排序其實最主要的兩個過程:第一步,建立初始堆;第二步,交換根節點與最後乙個非葉子節

從最後乙個非葉子節點為開始向前迴圈每個會支節點,比較每個分支節點與他左右子節點,如果其中某個子節點比父節點大,則與父節點交換,交換後原父節點可能還小於原子節點的子節點,所以還需對原父節點進行調整,使用原父節點繼續下沉,直到沒有子節點或比左右子節點都大為止,呼叫過程可通過遞迴完成。當某個非葉子節點調整完畢後,再處理下乙個非葉子節點,直到根節點也調整完成,這裡初始堆就建立好了,這裡我們建立的是大頂堆,即大的元素向樹的根浮,這樣排序最後得到的結果為公升序,因為最大的

將樹中的最後乙個元素與堆頂元素進行交換,並從樹中去掉最後葉子節點。交換後再按建立初始堆的演算法調整根節點,如此下去直到樹中只有乙個節點為止。

四、 演算法的流程圖

五、 演算法設計分析

1、氣泡排序:bubblesort()

氣泡排序演算法分析:

(1)最好情況, 待排序的檔案已是有序檔案:

只需要進行1趟排序,

共計比較關鍵字的次數為n-1

不交換記錄。

(2)最壞情況, 要經過n-1趟排序,

所需總的比較關鍵字的次數為

(n-1)+(n-2)+...+1=n(n-1)/2

交換記錄的次數最多為

(n-1)+(n-2)+...+1=n(n-1)/2

移動記錄次數最多為

3n(n-1)/2

(3)只需要少量中間變數作為輔助空間。

演算法是穩定的。

2、選擇排序:selsort()

選擇排序演算法分析:

(1)比較次數,在任何情況下,均為

(2)交換記錄的次數

在最好情況下,原n個記錄遞增有序:不移動記錄。

在最壞情況下共交換記錄n-1對,移動記錄數3(n-1)次。

故,時間複雜度為o(n2)。

(3)只需少量中間變數作為輔助空間。

(4)演算法是不穩定的。

3、直接插入排序 :inssort()

直接插入排序演算法分析:

故,時間複雜度為o(n2)。

(4) 只需少量中間變數作為輔助空間。

(5) 演算法是穩定的。

4、快序排序:quicksort(d)

快速排序演算法分析:

(1)就平均速度而言,

快速排序是已知內部排序方法中最好的一種排序方法,

其時間複雜度為

o(nlog(n))。

(2)在最壞情況下,

快速排序所需的比較次數和氣泡排序的比較次數相同,

其時間複雜度為

o(n2)。

(3)快速排序需要乙個棧作輔助空間,用來實現遞迴處理左、右子檔案。

在最壞情況下,遞迴深度為n,

所需棧的空間大小為

o(n)。

(4)快速排序是不穩定的。

5、歸併排序:megersort()

歸併排序演算法分析:

(1)對n個記錄的檔案進行歸併排序,共需

log2n 趟,

(2)每趟所需比較關鍵字的次數不超過n, 共比較

o(nlog2n) 次。

(3)每趟移動n個記錄, 共移動記錄

o(nlog2n) 個

(4)歸併排序需要乙個大小為n的輔助空間

y[1..n]。

(5)歸併排序是穩定的。

6、堆排序:heapsort()

堆排序演算法分析:

(1)堆排序的時間,主要由建立初始堆和反覆重建堆這兩部分的時間開銷構成,

它們均是通過呼叫heapify實現的。

(2)堆排序的最壞時間複雜度為

o(nlgn)。

(3)堆排序的平均效能較接近於最壞效能。

由於建初始堆所需的比較次數較多,所以堆排序不適宜於記錄數較少的檔案。

(4)堆排序是就地排序,輔助空間為

o(1)。

(5)它是不穩定的排序方法

六、 源**

#include

#include

#include

#include

#include

//外部變數定義

int count1=0,bj1=0,yd1=0;

int count2=0,bj2=0,yd2=0;

int count3=0,bj3=0,yd3=0;

int count4=0,bj4=0,yd4=0;

int count5=0,bj5=0,yd5=0;

int count6=0,bj6=0,yd6=0;

clock_t start1,finish1;

clock_t start2,finish2;

clock_t start3,finish3;

clock_t start4,finish4;

資料結構課程設計實驗報告

姓名 陳白楊 班級 軟092 老師 王森玉 學號 099074177 實驗一 農夫過河問題 1 題目 農夫過河問題 2 問題描述 從前,一人農夫帶著乙隻狼,乙隻羊和一棵白菜 注意該狼已被農夫馴服了,但還是會吃羊 他要將所有東西安全的帶到河的對岸。不幸的是河邊只有一條小船,只能裝下農夫和他的一樣東西,...

資料結構課程設計心得

篇一 資料結構課程設計心得體會 通過本次課程設計,對圖的概念有了乙個新的認識,在學習離散數學的時候,總覺得圖是很抽象的東西,但是在學習了 資料結構與演算法 這門課程之後,我慢慢地體會到了其中的奧妙,圖能夠在計算機中存在,首先要捕捉他有哪些具體化 數位化的資訊,比如說權值 頂點個數等,這也就說明了想要...

資料結構課程設計報告

交通諮詢系統設計 不用輸入程式語句,也不用那個截圖 不用太著急,報告周五之前給我就行了 列印和壓縮包都要哈!對了,這段文字記得刪掉啊嘿嘿 題目名稱交通諮詢系統設計 院 系 管理學院 課程名稱資料結構課程設計 班級資訊 10 2 學生姓名呂德麗 指導教師李長雲 目錄一 需求分析及選題要求 3 1 問題...