演算法設計與分析 插入排序演算法與歸併排序演算法比較

2021-09-29 10:31:40 字數 2710 閱讀 3757

通過插入排序演算法與歸併排序演算法效率對比體會演算法在求解問題中的重要性。

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

利用隨機函式產生大量資料存入陣列作為待排序列;

分別測試待排序列資料量為1000、1萬、10萬、100萬、1000萬的情況下兩種演算法各自的執行時間,通過對比分析研究哪個演算法在資料量逐漸增大時效率高;

對兩種演算法進行理論分析哪個演算法效率高;

與實驗資料對照,檢查是否實驗結果驗證了理論分析的結果。

直接插入排序:

for j=2 to a.length

key=a[j]

i=j-1;

while i>0 and a[i]>key

a[i+1]=a[i]

i=i-1

a[i+1]=key

歸併排序:

merge(a,p,q,r)

n1=q-p+1;

n2=r-q;

for i=0 to n1

l[i]=a[p+i-1]

for j=0 to n2

r[j]=a[q+j]

l[n1]=inf//假設1000是無窮大

r[n2]=inf

i=j=1

for k=p to r

if(l[i]<=r[j])

a[k]=l[i]

i=i+1

else

a[k]=r[j]

j=j+1

merge_sort(a,p,r)

if pq=floor((p+r)/2)

merge_sort(a,p,q)

merge_sort(a,q+1,r)

merge(a,p,q,r)

每個演算法時間複雜度分析

直接插入排序的時間複雜度為q(n2),歸併排序的時間複雜度為q(nlgn)。

結論歸併排序的演算法比直接插入排序的演算法的增長速度慢,也就是說,當資料量大的時候,歸併排序將占有優勢,速度快於插入排序。當資料量小的時候,插入排序將占有優勢,速度快於歸併排序。。

測試資料:1000、1萬、10萬、100萬、1000萬

執行結果介面截圖

測試結果示例:(單位:微秒)

演算法名稱

資料量1000

1萬10萬

100萬

1000萬

平均執行時間

插入排序

838.1

80828.8

7.40966e+006

9.17404e+008

∞q(n2)

歸併排序

152.8

1793.5

17411

213525

2.31033e+006

q(nlgn)

#include #include#include#include#includeconst int inf = 1e8;

const long long maxn = 1e8 + 10;

const long long mod = 1e9 + 7;

int a1[maxn], a2[maxn];

int l[maxn]= ;

int r[maxn]= ;

using namespace std;

void insertsort(int *a,int n)//直接插入排序

a[j+1]=tmp;

}}void marge(int *a,int left,int mid,int right)

else

}}void margesort(int *a,int left,int right)

else

return ;

}int main()

/*cout << "待排序的數字:" <

for(int i=0; i<10; i++)

*///首先獲取cpu頻率

double run_time;

_large_integer time_start;//開始時間

_large_integer time_over;//結束時間

double dqfreq;//計時器頻率

large_integer f;//計時器頻率

queryperformancefrequency(&f);

dqfreq=(double)f.quadpart;

cout<

queryperformancecounter(&time_start);

insertsort(a1, n); //插入排序計時

queryperformancecounter(&time_over);

run_time=1000000*(time_over.quadpart-time_start.quadpart)/dqfreq;//乘以1000000把單位由秒化為微秒,精度為1000 000/(cpu主頻)微秒

cout<

/*cout << "插入排序後的數字:" <

for(int i = 0; i < n; i++)

cout << endl;*/

}return 0;

}​

演算法設計與分析 排序演算法(一) 插入排序

分類目錄 演算法設計與分析 總目錄 排序演算法 二 歸併排序 插入排序對於少量元素的排序是乙個有效的演算法。插入排序的工作方式像許多人排序一手撲克牌。開始時,我們的左手為空並且桌子上的牌面向下。然後,我們每次從桌子上拿走一張牌並將它插入手中正確的位置。為了找到一張牌的正確位置,我們從右到左將它與已在...

演算法 插入排序與選擇排序

一 插入排序 1 直接插入排序是一種簡單的插入排序法,其基本思想是 把待排序的記錄按其關鍵碼值的大小逐個插入到一 個已經排好序的有序序列中,直到所有的記錄插入完為止,得到乙個新的有序序列 思想十分簡單,演算法實現如下 直接插入排序 越有序插入越快 將每乙個數與前面所有排好序的數字相比較,如果大了 直...

排序演算法 插入排序與希爾排序

最近一直在看 演算法 正好複習到了排序這部分,就都總結一下。插入排序 插入排序和選擇排序都屬於非常簡單而且容易理解的排序演算法。插入排序就像我們平時玩的紙牌,在排順序的時候,會按照順序一張一張插入。在乙個亂序陣列中,同樣如此,我們會在遍歷中,將資料按照公升序或降序方式向之前已經排列好的資料中進行插入...