資料結構排序演算法習題

2021-10-03 06:23:10 字數 2365 閱讀 7792

問題描述:

演算法思路:

快排演算法和三者取中演算法都運用了遞迴思想,將樞軸元素定好位置後分別對左邊和右邊繼續呼叫該函式,直到排到只剩乙個數為止。為了衡量不同演算法的效率,隨機生成資料並且存於檔案中,從檔案中取資料並利用不同演算法進行排序。

演算法描述:

1. void quick(int data,int a, int b)  //快排函式

該函式輸入為整型陣列,a, b分別為待排陣列的起始點和終點。然後將data[a]作為樞軸元素。定義兩個指標startptr和endptr,指向待排陣列的兩端,並且向中間靠攏。當startptr遇到比樞軸元素大的數,endptr遇到比樞軸元素小的數,則這兩個數交換位置。直到兩指標相遇為止,然後將樞軸元素賦值給兩指標相遇的位置,即樞軸元素在待排序列中的正確位置。然後呼叫兩次本函式,分別對樞軸元素左邊和右邊的待排陣列進行同樣的操作,不斷遞迴,直到只剩乙個數待排序為止。

2.void threequick(int data,int a, int b) //三者取中

該函式和快排函式基本一致,只對樞軸元素的選取作了調整。不在直接將待排陣列的第乙個元素直接作為樞軸元素,而是從待排陣列的第乙個元素,中間的元素和最後乙個元素中選乙個大小居中的元素作為樞軸元素。然後將其和第乙個元素交換位置,其餘函式和快排函式一致。

3.void insert(int data,int a, int b) //插入排序

該函式輸入為整型陣列,待排陣列的起點a和終點b。然後進入迴圈,從待排陣列的第二個元素開始掃瞄,若它大於或等於前乙個元素,則繼續掃瞄。否則在前邊找到該元素的插入點,移動陣列,進行插入。然後繼續掃瞄。掃瞄到終點後,該陣列的插入排序也就完成了。

4.void datacreat() // 生成資料

該函式會在c:\\新建資料夾\\1.txt.txt檔案中生成12000個小於100000的隨機正整數,滿足排序的需要。

5.int main()

主函式會根據使用者輸入進行操作。使用者輸入為0時呼叫datacreat函式,生成新資料;使用者輸入為1時進行快速排序;使用者輸入為2時進行三者取中排序;使用者輸入為3時進行插入排序。並且對演算法排序時間進行計算並輸出,以衡量演算法效率。

源程式:

#include

#include

#include

int timeall=0;

void

quick

(int data,

int a,

int b)

data[i]

=data[0]

;quick

(data,a,i-1)

;quick

(data,i+

1,b)

;return;}

//快排

void

threequick

(int data,

int a,

int b)

else

}

data[0]

=data[a]

;while

(idata[i]

=data[0]

;quick

(data,a,i-1)

;quick

(data,i+

1,b)

;return;}

//三者取中法

void

insert

(int data,

int a,

int b)

data[j+1]

=data[0]

;}}//插入排序

void

datacreat()

fclose

(fp);}

//生成資料

intmain()

end=

clock()

; time=

(double

)(end-start)

/clocks_per_sec;

printf

("%f seconds\n"

, time )

;//輸出執行時間

fclose

(fp)

;return0;

}

結果分析和結論:

排序功能全部正確實現,並且同乙個資料的三者取中演算法的時間確實比快排要短。

心得體會:

同乙個組資料,同乙個演算法的執行時間會有所變化,雖然可以從大體上看到三者取中演算法比快排時間斷短,但是執行時間的不穩定說明還有其他干擾因素。這使結論變得不太完全令人信服。或許時間效率的度量還有更好的方法。

資料結構 排序演算法

include include define maxitem 100 typedef char keytype 5 typedef int elemtype typedef struct rec elemnode maxitem 氣泡排序演算法 void bubblesort elemnode r,...

資料結構 排序演算法

排序演算法分為內部排序和外部排序兩大類。內部排序 在計算機記憶體中完成的排序演算法 外部排序 不能再記憶體中文完成,必須在磁碟或者磁帶上完成的排序演算法 內部排序是研究的重點問題,通常我們講的八大排序演算法也主要是講的內部排序演算法。排序演算法的穩定性和時間空間複雜度 本文重點介紹以下幾種排序演算法...

資料結構 排序演算法

直接插入排序是指將r i r n 插入到已經有序的r 1 r i 1 序列中。r 0 是乙個哨兵,起到作為邊界條件並作為暫存單元的作用。實際上,一切為簡化邊界條件而引入的附加節點 元素 均可稱為哨兵。例如單鏈表中的頭結點。對於有n個記錄的集合,要進行n 1趟排序。其最優時間複雜度是o n 平均時間複...