遞迴對陣列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 經常直接使用直接插入排序演算法等高複雜度的演算法。這樣做,會帶來一定的好處,例如歸併排序減少分配...