分治法 合併排序

2021-07-02 14:09:24 字數 2706 閱讀 6524

合併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用

分治法

(divide and conquer)的乙個非常典型的應用。合併排序法是將兩個(或兩個以上)有序表合併成乙個新的有序表,即把待排序序列分為若干個子串行,每個子串行是有序的。然後再把有序子串行合併為整體有序序列。將已有序的子串行合併,得到完全有序的序列;即先使每個子串行有序,再使子串行段間有序,合併排序也叫歸併排序。

1、遞迴實現的合併排序

[cpp]view plain

copy

//2d7-1 遞迴實現二路歸併排序

#include "stdafx.h"

#include 

using

namespace

std;   

inta = ;  

intb[7];  

template

<

class

type>  

void

merge(type c,type d,

intl,

intm,

intr);  

template

<

class

type>  

void

mergesort(type a,

intleft,

intright);  

intmain()  

cout

for(

inti=0; i<7; i++)  

cout

template

<

class

type>  

void

merge(type c,type d,

intl,

intm,

intr)  

else

}  if(i>m)  

}  else

}  }  template

<

class

type>  

void

mergesort(type a,

intleft,

intright)  

}  }  

2、合併排序非遞迴實現

從分支策略機制入手,可消除程式中的遞迴。非遞迴實現的大致思路是先將陣列a中元素兩兩配對,用合併演算法它們排序,構成n/2組長度為2的排好的子陣列段,然後再將它們排成長度為4的排好序的子陣列段,如此繼續下去,直到整個陣列排好序。

程式**如下:

[cpp]view plain

copy

//2d7-1 自然二路歸併排序

#include "stdafx.h"

#include 

using

namespace

std;   

inta = ;  

intb[7];  

template

<

class

type>  

void

merge(type c,type d,

intl,

intm,

intr);  

template

<

class

type>  

void

mergepass(type x,type y,

ints,

intn);  

template

<

class

type>  

void

mergesort(type a,

intn);  

intmain()  

cout

for(

inti=0; i<7; i++)  

cout

template

<

class

type>  

void

merge(type c,type d,

intl,

intm,

intr)  

else

}  if(i>m)  

}  else

}  }  template

<

class

type>  

//合併大小為s的相鄰子陣列

void

mergepass(type x,type y,

ints,

intn)  

//剩下的元素個數少於2s

if(i+s

else

}  }  template

<

class

type>  

void

mergesort(type a,

intn)  

}  

程式清單中77至86行解釋如下:當剩餘元素少於2s時,分兩種情況。

1、當i+s

2、當i+s>=n時,剩餘元素已排好序,直接複製。例如:設s=4,n=11,i=8有如下圖:

分治法 合併排序

排序演算法是對一組數進行順序排序或者逆序排序,而合併排序就是排序演算法的一種。合併排序用到了分治策略實現對元素進行排序。合併排序的基本思想 把待排序的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 ...

基礎演算法 合併排序(分治法)

基礎演算法 合併排序演算法 分治法 的宗旨是將問題 分解 處理 歸併 將書中的偽 翻譯為c c 語言實現,大致可用兩個函式來解決問題,第乙個函式實現 治 也就是分解問題,處理問題 的步驟,另乙個函式通 過遞迴實現 分 合 的操作。實現 分 治 的函式實現如下 void merge int parra...