C語言排序(五 插入排序與歸併排序演算法比較

2021-08-13 04:39:38 字數 2716 閱讀 1828

一.實驗內容:

1、         編寫函式分別實現插入排序和歸併排序演算法

2、         編寫主函式通過呼叫函式實現對待排資料的呼叫

3、         待排資料利用隨機函式迴圈產生10萬個以上的資料

4、         利用求系統時間的函式,分別求出2個排序函式呼叫前和呼叫後的時間,計算出插入排序執行時間和歸併排序的執行時間

5、         演算法的比較:

(1)                      相同待排序資料下,插入排序和歸併排序演算法的執行時間比較;

(2)                      同一種排序演算法下最好的情況,一般情況,最壞的情況執行時間比較

插入排序:插入即表示將乙個新的資料插入到乙個有序陣列中,並繼續保持有序。例如有乙個長度為n的無序陣列,進行n-1次的插入即能完成排序;第一次,陣列第1個數認為是有序的陣列,將陣列第二個元素插入僅有1個有序的陣列中;第二次,陣列前兩個元素組成有序的陣列,將陣列第三個元素插入由兩個元素構成的有序陣列中......第n-1次,陣列前n-1個元素組成有序的陣列,將陣列的第n個元素插入由n-1個元素構成的有序陣列中,則完成了整個插入排序。

以下面5個無序的資料為例:

65 27 59 64 58 (文中僅細化了第四次插入過程)

第1次插入: 27 65 59 6458

第2次插入: 27 59 65 6458

第3次插入: 27 59 64 6558

第4次插入: 27 58 59 6465

二.演算法分析

三.實驗**
#include#include//數學

#include//時間

void insertsort(long int *, long int); //定義插入排序函式

void merge(long int x, long int z, long int s, long int u, long int v);

void mergepass(long int x, long int y,long int n, long int t);

void mergesort(long int x,long int n);

void insertsort(long int *array,long int len)

else

} array[j+1] = temp;

} } //將有序的x[s..u]和x[u+1..v]歸併為有序的z[s..v]

void merge(long int x,long int z, long int s, long int u, long int v)

while( i <= u ) //將x中剩餘元素x[i..u]複製到z

z[q++] = x[i++];

while( j <= v ) //將x中剩餘元素x[j..v]複製到z

z[q++] = x[j++];

}

/* x[0..n-1]表示參加排序的初始序列

* t為某一趟歸併時子串行的長度

* 整型變數i指出當前歸併的兩個子串行中第1個子序列的第1個元素的位置

* y[0..n-1]表示這一趟歸併後的結果

*/

void mergepass(long int x, long int y, long int n,long int t)

if( n - i > t ) //若最後剩下的元素個數大於乙個子串行的長度t時

merge(x, y, i, i + t - 1, n - 1);

else //n-i <= t時,相當於只是把x[i..n-1]序列中的資料賦值給y[i..n-1]

for( j = i ; j < n ; ++j )

y[j] = x[j];

}

void mergesort(long int x,long int n)

free(y);

}

void print_array(long int array,long int n)

int main()

insertsort(d,n);

finish = clock();//取結束時間

printf( "\n%f 毫秒\n",(finish-start)/clocks_per_sec*1000); /

/* for(i=0;i<100;i++)

printf("\n\n\n\n\n");

*/ //

printf("%d個數歸併排序最好結果用時:",n);

start=clock();//取開始時間

for(i=0;i=0;i--)

mergesort(d,n);

/*for(i=0;i四.實驗結果

五.實驗分析

在隨機數組中,歸併排序明顯優於插入排序,且數值越大越明顯。有序序列結果不明顯,但仍然歸併排序優於插入排序。

插入排序與歸併排序

關於排序似乎從大一開始學習變成就開始在使用各種排序方法了,今天看了下有關於插入排序和歸併排序的內容,並且對應在leetcode 上面做了兩道測試題,因此就對插入排序和歸併排序做乙個簡單的小結吧,就當做是我的學習筆記,大佬請勿嘲笑!關於插入排序主要的思想就是從左到右的遍歷乙個序列,有乙個標識來標記,保...

插入排序 歸併排序

插入排序 define len 5 int a len void insertion sort void int i,j,k for j 1 j len j k a j i j 1 while i 0 a i k a i 1 a i i a i 1 k 歸併排序 int a 8 void merge...

插入排序 歸併排序

演算法導論初涉,第一講練習內容 include define n 6 int a n void init 初始化陣列 a i 1 k void output int a,int n void merge int low,int mid,int high while s mid b i a s whi...