內部排序演算法的實現與比較 資料結構課程設計

2021-08-10 10:32:02 字數 2461 閱讀 7987

1) 問題描述

在教科書中,各種內部排序演算法的時間複雜度分析結果只給出了演算法執行時間的階,或大概執行時間。試通過隨機資料比較各演算法的關鍵字比較次數和關鍵字移動次數,以取得直觀感受。

2)基本要求

(1) 對常用的內部排序演算法進行比較:直接插入排序、簡單選擇排序、氣泡排序、快速排序、希爾排序、歸併排序。

(2) 利用隨機函式產生n(

n=30000

)個隨機整數,作為輸入資料作比較;比較的指標為關鍵字參加的比較次數和關鍵字的移動次數(關鍵字交換計為

3次移動)。

(3) 對結果作出簡要分析。

3)測試資料

隨機函式產生。

4)提示

主要工作是設法在已知演算法中適當位置插入對關鍵字的比較次數和移動次數的計數操作。注意採用分塊除錯的方法。

5)輸入輸出

:

輸入資料:參加排序的整數個數n(

n=30000

,注:不得減少n);

輸出資料:各種排序方法的關鍵字比較次數和移動次數(從小到大排列)。

本來氣泡排序交換次數想用樹狀陣列bit發現資料太多時 用bit加的資料會超限 所以還是直接用了氣泡排序 

上**--純c語言:

/** 直接插入: charu函式

* 選擇: xuanzepai函式

* 冒泡: maopao函式

* 快排: qsort 遞迴函式

* 希爾:shell 函式

* 歸併:gb 函式

*/ # include # include # include # define n 30000

# define sr 1001

int a[n],b[n],c[n],d[n],e[n],f[n],g[n];

int a,aa,b,bb,d,dd,e,ee,f,ff,num; //單個字母的為記錄的比較次數-移動的次數,雙字母為關鍵字的移動次數

long long c,cc;

void charu(int a,int n);//對n個元素 直接插入排序

void xuanzepai(int a,int n);//對n個元素 選擇公升序

void maopao(int a,int n); // 氣泡排序

void quicksort(int a,int l,int r);//對[l,r]個元素 快速公升序

void shell(int a,int n);//對n個元素 shell 公升序

void gbpx(int s,int l,int r,int t);// 歸併排序

int gb(int s,int l,int m,int r,int t);//陣列歸併操作

int gainint(int *p,int min,int max);//防輸錯而建的函式 *p的範圍[min,max]

int change(int *a,int *b);//交換函式 交換a b的值

void charu(int a,int n)//返回迴圈比較次數

} void xuanzepai(int a,int n)//以a[0]為比較依據 公升序

} } void quicksort(int a,int l,int r)//快速排序 公升序 }}

int gb(int s,int l,int m,int r,int t)//陣列歸併操作

else t[k++]=s[j--];

count++;

} while(i>=l) //若前半段陣列還有元素未放入臨時陣列t中

while(j>m)

for(i=0,f+=k;i>1;

gbpx(s,l,m,t);//找左半段的逆序對數目

gbpx(s,m+1,r,t);//找右半段的逆序對數目

ff+=gb(s,l,m,r,t);//找完左右半段逆序對以後兩段陣列有序,找兩段之間的逆序對。

}

} int gainint(int *p,int min,int max)//輸入int *p直至滿足(a,b)輸入結束,並返回*p的位數

{

do{

*p=min-1; //此處是為了減少意外情況的發生 雖然那種意外情況不常見

scanf("%d",p);

while(getchar()!='\n');

if(*p>max||*pmax||*p

《資料結構》 內部排序演算法比較

題目 各種內部排序演算法的時間複雜度分析結果只給出了演算法執行時間的階,或大概執行時間。試通過隨機的資料比較各演算法的關鍵字比較次數和關鍵字移動次數,以取得直觀感受。基本要求 1 從以下常用的內部排序演算法至少選取5種進行比較 直接插入排序 折半折入排序 希爾排序 起泡排序 快速排序 簡單選擇排序 ...

排序 內部排序演算法實現

1.歸併排序 分析 歸併排序使用分治思想,原理是 將乙個無序數列分成兩個序列後,對序列進行排序後,再將兩個有序序列合併成乙個有序序列 分開的兩個序列又可以進行再分排序然後合併從而形成問題的子問題。include include void merge int a,int ans,int s,int m...

幾種排序演算法的實現與比較

排序演算法比較 利用隨機函式產生n個隨機整數,利用直接插入排序 折半插入排序,起泡排序 快速排序 選擇排序 堆排序,基數排序七種排序方法進行排序 結果為由小到大的順序 並比較次數和交換次數。這裡是源 include using namespace std include include includ...