分治法 K路合併

2021-09-26 06:39:14 字數 1139 閱讀 5544

假定有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 ...