歸併演算法的改進

2021-08-24 17:36:00 字數 1365 閱讀 1987

遞迴對陣列b排序,將排序後的結果放入a中,下次遞迴排序時對陣列a排序,將結果放入b中,以此方式可以完成對陣列的排序.且沒有出現在子陣列合併後陣列之間的複製.

#include #include #include #include #include #include using namespace std;

#define ok 1

#define error -1

#define true 1

#define false 0

typedef int status;

//輸出函式

void print(int a, int l, int r)

printf("\n");

}//插入排序的改進

void insertion(int a, int l, int r)

}//由於上面的迴圈,a[0]a[1]已經有序

for(i = l+2; i <= r; i++)

//將記錄下的值放到應當的位置

a[j] = temp;

}}void mergeab(int c, int a, int n, int b, int m)

//陣列b賦完了的情況

if(j == m)

//在陣列a和陣列b都有元素沒被賦完的時候,比較當前兩元素的大小

//在按從小到大排序的陣列中,將值小的元素放入c

c[k] = a[i] < b[j] ? a[i++] : b[j++];

}}void mergesortabr(int a, int b, int l, int r)

int m = (l + r) / 2;

mergesortabr(b, a, l, m);

mergesortabr(b, a, m+1, r);

//呼叫mergeab()函式,確定兩個子陣列,,乙個子陣列起始位置是b[l],長度為m-l+1

//另乙個子陣列起始位置是b[m+1],長度為r-m,排好序之後放入a中相應位置

mergeab(a+l, b+l, m-l+1, b+m+1, r-m);

}//利用歸併排序對陣列a排序,該函式作為主函式與歸併排序函式的介面

void mergesortab(int a, int temp, int l,int r)

mergesortabr(a, temp, l, r);

}int main()

; int temp[12];

//歸併排序

printf("對0~11排序\n");

mergesortab(a, temp, 0, 11);

print(a, 0, 11);

return 0;

}

歸併排序 改進歸併

歸併排序的主要思想是 分治 divide and conquer 策略,首先是分,先把問題拆分成規模很小的問題 然後是治,將子問題的答案合併成乙個更大的小問題的答案,直到合併成問題本身的答案。分解的過程就是一顆二叉樹,既然是二叉樹,遞迴深度也就知道了是log 2 再來看合併的過程,分別會有兩個指標指...

第十六周 歸併演算法的改進

作 者 孫子策 完成日期 2016.12.15 問題描述 採用歸併排序 快速排序等高效演算法進行排序,當資料元素較少時 如n 64 經常直接使用直接插入排序演算法等高複雜度的演算法。這樣做,會帶來一定的好處,例如歸併排序減少分配 臨時儲存區域的頻次,快速排序減少遞迴層次等。試按上面的思路,重新實現歸...

專案 3 歸併排序演算法的改進

all right reserved.檔名稱 test.cpp 完成日期 2016年12月20日 版本號 v1.8.7 問題描述 採用歸併排序 快速排序等高效演算法進行排序,當資料元素較少時 如n 64 經常直接使用直接插入排序演算法等高複雜度的演算法。這樣做,會帶來一定的好處,例如歸併排序減少分配...