題目
各種內部排序演算法的時間複雜度分析結果只給出了演算法執行時間的階,或大概執行時間。試通過隨機的資料比較各演算法的關鍵字比較次數和關鍵字移動次數,以取得直觀感受。
基本要求:
(1) 從以下常用的內部排序演算法至少選取5種進行比較:直接插入排序;折半折入排序;希爾排序;起泡排序;快速排序;簡單選擇排序;堆排序;歸併排序。
(2) 待排序表的表長為20000;其中的資料要用偽隨機數產生程式產生;至少要用5組不同的輸入資料作比較;比較的指標為有關鍵字參加的比較次數和關鍵字移動次數(關鍵字交換計為3次移動)。
**
#ifndef _head_h
#define _head_h
#include
#include
#include
#include
#define max 20002
typedef
int keytype;
typedef
int infotype;
typedef
struct ss
rectype;
//排序的元素的型別
typedef
struct sss
analysis;
//儲存分析效率的4資料
//交換函式
void
swap
(rectype &a, rectype &b)
int compare =
0, move =0;
//關鍵字比較和移動的次數
analysis analy[5]
;//五種演算法的分析資料
//直接插入排序演算法
//時間複雜度o(n^2)
void
insertsort
(rectype r,
int n)
;//折半插入排序法
//把無序區插入到有序區里,由於前面的插入排序法實現了有序,所以直接在
//有序區利用折半查詢來尋找的改進演算法
void
bininsertsort
(rectype r,
int n)
;//希爾排序演算法
void
shellsort
(rectype r,
int n)
;//氣泡排序演算法
void
bubblesort
(rectype r,
int n)
;/*快速排序演算法*/
intpartition
(rectype r,
int s,
int t)
;//一趟劃分
//對r[s..t]的元素進行快速排序
void
quicksort
(rectype r,
int s,
int t)
;//選單
void
menu()
;//呼叫直接插入排序的實現函式,即選單1
void
firstfun
(rectype a,
int n)
;//選單2
void
secondfun
(rectype a,
int n)
;//選單3
void
thirdfun
(rectype a,
int n)
;//選單4
void
fourthfun
(rectype a,
int n)
;//選單5
void
fifthfun
(rectype a,
int n)
;//選單6
void
sixthfun
(rectype a,
int n)
;#endif
//五種常見的演算法
/////直接插入排序演算法
//時間複雜度o(n^2)
void
insertsort
(rectype r,
int n)
while
(j >=
0&& r[j]
.key > tmp.key)
; r[j +1]
= tmp;
//最後把tmp放在對應的位置
move+=2
;//移動的temp}}
}//折半插入排序法
//把無序區插入到有序區里,由於前面的插入排序法實現了有序,所以直接在
//有序區利用折半查詢來尋找的改進演算法
void
bininsertsort
(rectype r,
int n)
for(j = i -
1; j >= high +
1; j--
) r[high +1]
= tmp;
move +=2
;//tmp交換}}
}///
//希爾排序演算法
void
shellsort
(rectype r,
int n)
r[j + d]
= tmp;
move +=2
;//tmp進行兩次操作
} d = d /2;
}}/////氣泡排序演算法
void
bubblesort
(rectype r,
int n)if(
!exchange)
return;}
}//*快速排序演算法*/
intpartition
(rectype r,
int s,
int t)
//一趟劃分
r[i]
= r[j]
;//找到這樣的r[j],放入r[i]處
move++
;//移動+1
while
(i < j && r[i]
.key <= tmp.key)
r[j]
= r[i]
;//找到這樣的r[i],放入r[j]處
move++
;//移動加一
} r[i]
= tmp;
move+=2
;//temp的交換
return i;
}void
quicksort
(rectype r,
int s,
int t)
//對r[s..t]的元素進行快速排序}/
void
menu()
//呼叫直接插入排序的實現函式,即選單1
void
firstfun
(rectype a,
int n)
//選單2
void
secondfun
(rectype a,
int n)
//選單3
void
thirdfun
(rectype a,
int n)
//選單4
void
fourthfun
(rectype a,
int n)
//選單5
void
fifthfun
(rectype a,
int n)
//選單6
void
sixthfun
(rectype a,
int n)
int main (
)system
("pause");
system
("cls");
menu()
;printf
("請選擇操作:");
scanf
("%d"
,&k);}
system
("pause");
return0;
}
執行結果
記得點讚啊!!
資料結構中各種內部排序演算法的比較
20101002 1 快速排序 quicksort 快速排序是乙個就地排序,分而治之,大規模遞迴的演算法。從本質上來說,它是歸併排序的就地版本。快速排序可以由下面四步組成。1 如果不多於1個資料,直接返回。2 一般選擇序列最左邊的值作為支點資料。3 將序列分成2部分,一部分都大於支點資料,另外一部分...
資料結構七大內部排序 演算法比較
1 氣泡排序 include using namespace std 氣泡排序 void bubblesort int a,int n if exchange false 氣泡排序測試 intmain bubblesort nums,n for int i 0 i i else delete num...
資料結構 各種排序演算法比較
一,各種排序演算法比較 各種排序演算法比較 二,相關概念 1 穩定排序和非穩定排序 簡單地說就是所有相等的數經過某種排序方法後,仍能保持它們在排序之前的相對次序,我們就說這種排序方法是穩定的。反之,就是非穩定的。比如 一組數排序前是a1,a2,a3,a4,a5,其中a2 a4,經過某種排序後為a1,...