歸併排序(分治法 簡潔易懂)

2021-07-09 21:06:50 字數 877 閱讀 6495

歸併排序是一種高效的排序演算法(時間複雜度(o(nlogn))),按照分治三步法,對歸併排序演算法介紹如下:

劃分問題: 把序列分成元素個數盡量相等的兩半

遞迴求解:把兩半元素分別排序。

合併問題:把兩個有序表合併成乙個

(我之前看都沒有看過歸併排序這麼簡潔的**,包括在書上)

歸併好處:高效(思想也很重要)

缺點:需要輔助儲存空間。

#include"stdio.h"

#include"stdlib.h"

#include"algorithm"

#include"math.h"

using namespace std;

const int maxn=50005;

int data[maxn];

int tmp[maxn];

int cnt=0;

void merge_sort(int data,int left,int right,int tmp)

// 閉合區間[left,right]

{ if(right>left) //至少有乙個元素

{ int m=left+(right-left)/2; //劃分

merge_sort(data,left,m,tmp); //遞迴求解

merge_sort(data,m+1,right,tmp);//遞迴求解

int le=left,ri=m+1;

int i=left;

while(le<=m||ri<=right) //合併求解

{ if(ri>right||(le<=m)&&(data[le]

上面**除了歸併排序之外,還增加了求逆序對,這便是歸併排序的直接應用了。

分治法,歸併排序

1.時間複雜度為o nlog n 非降序 package com.cn.insertion 歸併排序,採用分治法的策略 author administrator public class merge sort mergesort a,0,9 for int i 0 i a.length i 先分在和...

分治法(歸併排序)

分治法.cpp 定義控制台應用程式的入口點。include stdafx.h include include include define max 30 using namespace std int l max int r max void merge int a,int p,int q,int ...

分治法 歸併排序

歸併排序是分治法的典型應用,思想如下 divide divide the array to 2 subarray conquer reverse in 2 subarray,if only one elem return combine merge two ordered subarray t n ...