歸併排序是用分治思想,分治模式在每一層遞迴上有三個步驟:
2.1 迭代法
① 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列2.2 遞迴法② 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
③ 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
④ 重複步驟③直到某一指標到達序列尾
⑤ 將另一串行剩下的所有元素直接複製到合併序列尾
① 將序列每相鄰兩個數字進行歸併操作,形成floor(n/2)個序列,排序後每個序列包含兩個元素// leetxodetest.cpp : 定義控制台應用程式的入口點。② 將上述序列再次歸併,形成floor(n/4)個序列,每個序列包含四個元素
③ 重複步驟②,直到所有元素排序完畢
//#include "stdafx.h"
#include #include #include#include#include#include < unordered_map >
using namespace std;
typedef int elemtype;
void merge(elemtype *r, elemtype *rf, int i, int m, int n);
void print(int a, int n);
void mergesort(elemtype *r, elemtype *rf, int lenght);
int _tmain(int argc, _tchar* ar**)
; int b[10];
mergesort(a, b, 10);
print(b, 10);
cout << "結果:";
print(a, 10);
/ system("pause ");
return 0;
}void merge(elemtype *r, elemtype *rf, int i, int m, int n)
while (i <= m) rf[k++] = r[i++];
while (j <= n) rf[k++] = r[j++];
print(rf, n + 1);
}void print(int a, int n){
for (int j = 0; j1.歸併排序,是建立在歸併操作上的一種有效的排序演算法。演算法是採用分治法(divide and conquer)的乙個非常典型的應用,且各層分治遞迴可以同時進行。歸併排序思路簡單,速度僅次於快速排序,為穩定排序演算法,一般用於對總體無序,但是各子項相對有序的數列。
2.複雜度分析
平均時間複雜度:o(nlogn)最佳時間複雜度:o(n)
最差時間複雜度:o(nlogn)
空間複雜度:o(n)
排序方式:in-place
穩定性:穩定
歸併排序詳解
一.概念 歸併是指將若干個已排序的子檔案合併成乙個有序的檔案。二.基本思路 設兩個有序的子檔案 相當於輸入堆 放在同一向量中相鄰的位置上 r low.m r m 1.high 先將它們合併到乙個區域性的暫存向量r1 相當於輸出堆 中,待合併完成後將r1複製回r low.high 中。合併過程中,設定...
歸併排序詳解
歸併排序的核心思想是將兩個已經排序的序列合併成乙個序列,那如何得到兩個已經排序的序列呢?我們知道,如果乙個序列只有乙個元素,那該序列是已經排序的,這樣我們就可以利用分治的思想,將未排序的序列劃分成更小的序列,只到我們可以很方便的對小序列進行排序 比如劃分到序列只有乙個元素,或者序列很小可以方便的使用...
歸併排序 詳解
歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法 divide and conquer 的乙個非常典型的應用,歸併排序將兩個已排序的表合併成乙個表。優點1.歸併排序的效率達到了巔峰 時間複雜度為o nlogn 這是基於比較的排序演算法所能達到的最高境界 2.歸併排序是一種穩定的...