1. 程式人生 > >歸併排序演算法(遞迴實現)

歸併排序演算法(遞迴實現)

歸併(Merge)排序法是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。

歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。

  將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合併成一個有序表,稱為2-路歸併。

#ifndef MERGESORT_H
#define MERGESORT_H
#include <stdlib.h>
template<class T> inline void MergeSort(T *a,int len) //歸併排序演算法
{
	T *TR = (T *)malloc(sizeof(T) * len); //動態分配一個額外的儲存空間
	MSort(a,TR,0,len-1); //分裂然後呼叫歸併排序
	free(TR); //釋放記憶體
}
template<class T> void Merge(T a[],T TR[],int low,int mid,int high) //歸併排序
{
	int i = low;
	int j = mid + 1;
	int k = 0;
	while(i <= mid && j <= high)
	{
		if(a[i] < a[j])  //進行排序存入動態分配的陣列中
			TR[k++] = a[i++];
		else
			TR[k++] = a[j++];
	}
	while(i <= mid) //如果前一半中還有未處理完的資料,按順序移入動態分配的陣列內
		TR[k++] = a[i++];
	while(j <= high) //如果後一半中還有未處理完的資料,按順序移入動態分配的陣列內
		TR[k++] = a[j++];
	for(int v = 0,i = low;i <= high;++v,++i) //將排序好的資料移回到原序列中
		a[i] = TR[v];
}
template<class T> void MSort(T a[],T temp[],int low,int high)
{
	int mid;
	if(low < high)
	{
		mid = (low + high) / 2; //進行分裂
		MSort(a,temp,low,mid); //將前一半繼續分裂
		MSort(a,temp,mid + 1,high); //將後一半繼續分裂
		Merge(a,temp,low,mid,high); //進行歸併排序
	}
}
#endif //MERGESORT_H
#include "MergeSort.h"
#include <stdio.h>
int main()
{
	int a[] = {20,19,35,33,17,42,15,55,9,5,8,3,1};
	int len = sizeof(a) / sizeof(*a);
	MergeSort(a,len);
	printf("排序後的陣列序列:\n");
	for(int i = 0;i < len;++i)
		printf("%d ",a[i]);
	printf("\n");
	return 0;
}

相關推薦

歸併排序演算法(實現)

歸併(Merge)排序法是將兩個(或兩個以上)有序表合併成一個新的有序表,即把待排序序列分為若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。 歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法(Divide and Conquer

歸併排序演算法 及迴圈實現

第一步合併相鄰長度為1的子陣列段,這是因為長度為1的子陣列段是已經排好序的。 用一次對陣列arr的線性掃描就足以找出所有這些排好序的子陣列段。然後將相鄰的排好序的子陣列段兩兩合併,構成更大的排好序的子

歸併排序實現Java

遞迴實現的歸併排序,需要O(lgN)的棧空間,而非遞迴實現的歸併排序則不需要 原文地址:http://www.jianshu.com/p/39dd1d9b491d public class Sort { public static void MergeSort

歸併排序實現(C語言)

前言:理論很枯燥、文字更煩人,但是這裡將理論知識告訴大家並不是讓大家一上來就看乾巴巴的文字,因為我在程式碼中能註釋的地方都進行了註釋希望大家先跟著註釋打一遍,不要著急,當在黑色的星空中出現了結果,你就會為之振奮,有了繼續學下去的勇氣,當你對程式碼中的思想有了較深的理解後,再回

排序演算法6——圖解歸併排序及其與非實現

排序演算法1——圖解氣泡排序及其實現(三種方法,基於模板及函式指標) 排序演算法2——圖解簡單選擇排序及其實現 排序演算法3——圖解直接插入排序以及折半(二分)插入排序及其實現 排序演算法4——圖解希爾排序及其實現 排序演算法5——圖解堆排序及其實現 排序演算法6——圖解歸併排序及其遞迴與非

Java實現--歸併排序

《Java資料結構和演算法》如此描述分治演算法: 把一個大問題分成兩個相對來說更小的問題,並且分別解決每一個小問題,對每一個小問題的解決方案是一樣的:把每個小問題分成兩個更小的問題,並且解決它們。這個過程一直持續小去知道達到易於求解的基值情況,就不用再繼續分了。 時間複雜度:

歸併排序演算法

#include<cstdio> #include<cstdlib> #define MAX 1000 typedef struct seeqlist { int Array[MAX]; int length; }SeqList; void Merge(int S[],int

歸併排序演算法最通俗易懂的解析

分析: 非遞迴,即迭代,與遞迴最大的區別在於實現的方向不同。遞迴拆開來是“遞推”與“迴歸”,也就是先從頂層往下,逐層遞推到底層,再從底層逐層迴歸到頂層,所以mergesort的遞迴版本是先從頂層開始往下不斷對陣列一分為二,到底層歸併,回到上一層,再歸併,重複直到頂層。非遞迴

歸併排序與非)的實現

摘要: (1)歸併排序幾乎以O(NlogN)的時間界實現,是典型的分治演算法; (2)歸併排序的基本思路很簡單:就是將目標序列分為兩個部分,將兩個子序列排序好之後,再將它們合併。注意到合併兩個已排序

快速排序實現演算法

輸入:先輸入進行排序元素的個數,然後依次隨機輸入(或隨機生成)每個數字。 輸出:元素排序後的結果。 示例:輸入:8 9 1 2 4 8 6 15 8,輸出:1 2 4 6 8

c 和 Python 實現歸併排序,非

C: #include <iostream>   using namespace std;   #define MAXSIZE 9 typedef struct {     int r[MAXSIZE+1];     int length; }SqList;

歸併排序和非方法實現

/* 歸併排序 VS2010 */ #include <stdio.h> #include <stdlib.h> #include <string.h> #define OK 1 #define ERROR 0 #define MAX

演算法】氣泡排序與選擇排序實現

1 氣泡排序 1 氣泡排序: void bubbleSort(int *data,int start,int end) { if (start < end) { int temp = 0; int length = end -

排序演算法(四)——歸併排序

基本思想 分析歸併排序之前,我們先來了解一下分治演算法。 分治演算法的基本思想是將一個規模為N的問題分解為K個規模較小的子問題,這些子問題相互獨立且與原問題性質相同。求出子問題的解,就可得到原問題的解。 分治演算法的一般步驟: (1)分解,將要解決的問題劃分成若干規模較小

快速排序實現

/*把陣列arr按照一個支點分成左右兩個部分 左邊比支點小,右邊比支點大,再返回支點pivot*/ int partition(int *arr,int low, int high){ int pivot = arr[low]; //low為陣列的第一個元素的位置,high為陣列

歸併排序理解

https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F 先上一個網站,這個網站一定要看。 點開之後可以看到歸併排序的動態演示圖,只要能理解這個圖,就能夠理解遞迴和歸併排序了。 你可以看到圖裡面的數分了四層,然後

歸併排序與非的寫法

歸併排序              歸併排序就是把兩組有序的陣列,合併成一個有序的陣列。至於如何分成兩個有序的陣列,遞迴的方法就是,把一個未排序的陣列,一直對半分,直到分成兩個陣列長度為1,然後一層一層合併上去。非遞迴的方法就是,在同一個陣列,從合併相鄰兩個長度為1的資料

全排列演算法實現

前言: 在一些演算法題當中有時需要進行全排列,是一個比較簡單的遞迴呼叫,在這裡記錄下,以後可以直接拿來使用。 過程: 例如{1,2,3,4,5}: 第一步: {1}和{2,3,4,5}的全排列組合; {2}和{1,3,4,5}的全排列組合; {3}和{2,1,4,5}的全排列組合; …

演算法歸併排序演算法的java實現

歸併排序的核心程式碼: private static void mergeSort(int[] a, int i, int j) { if (i < j) { int mid =

資料結構和演算法 | 歸併排序演算法原理及實現和優化

歸併排序(MERGE-SORT)是建立在歸併操作上的一種有效的排序演算法,該演算法是採用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合併,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。 歸併排序的原理 歸