問題描述:
演算法思路:
快排演算法和三者取中演算法都運用了遞迴思想,將樞軸元素定好位置後分別對左邊和右邊繼續呼叫該函式,直到排到只剩乙個數為止。為了衡量不同演算法的效率,隨機生成資料並且存於檔案中,從檔案中取資料並利用不同演算法進行排序。
演算法描述:
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 平均時間複...