假定有k個有序陣列,每個陣列中含有n個元素,您的任務是將它們合併為單獨的乙個有序陣列,該陣列共有kn個元素。設計和實現乙個有效的分治演算法解決k-路合併操作問題。
// divide-exam2.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#include #include #include #include using namespace std;
/**********k路合併操作問題***********/
//相同長度的陣列合併代價最小,兩兩合併
vectormerge(vectorr1, vectorr2, int len1,int len2)
//c++ 標準庫使用比如vector::push_back 等這類函式時,會對引數的物件進行複製,連資料也會複製.這就會造成物件記憶體的額外建立,
//本來原意是想把引數push_back進去就行了.c++11 提供了std::move 函式來把左值轉換為xrvalue,
//而且新版的push_back也支援&&引數的過載版本, 這時候就可以高效率的使用記憶體了.
vectormerge_k(vector>& vec)
//隨機產生vector
void gen_random(vector>& vec)
}/**
void mergesort(vector> a, int min, int max)
} for (int j = n - 1; j >= i; --j) }
}int main()
; partition(a, 10);
for (int j = 0; j < i; ++j)
cout << a[j] << " "; //1 2 3 2
cout << endl;
for (int j = i; j <= y; ++j)
cout << a[j] << " "; //4 4
cout << endl;
for (int j = y+1; j < 10; ++j)
cout << a[j] << " "; //6 5 7 6
cout << endl;
**/return 0;
}
分治法 合併排序
合併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用 分治法 divide and conquer 的乙個非常典型的應用。合併排序法是將兩個 或兩個以上 有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。將已有序的子串行...
分治法 合併排序
排序演算法是對一組數進行順序排序或者逆序排序,而合併排序就是排序演算法的一種。合併排序用到了分治策略實現對元素進行排序。合併排序的基本思想 把待排序的n個元素分解成n組,也就是每組乙個元素 之後對分好的組進行兩兩合併 無配對的則不操作 以此類推。以序列為例,排序過程如下 合併排序又叫做2 路歸併排序...
分治法合併排序(C )
參考 include include include using namespace std 合併函式 void merge int arr,int p,int q,int r for int j 0 j len2 j l len1 r len2 int max 定義無窮大 int i 0,j 0 ...