1. 程式人生 > >資料結構排序之歸併排序

資料結構排序之歸併排序

/*
*遞迴 歸併排序
*/
#include<iostream>
using namespace std;
void Merge(int *, int , int, int *);

void Merge_Sort(int *data, const int start, const int end, int * result )
{
  if( 1 == end - start)//只有兩個元素
  {
	  if(data[start] > data[end])
	  {
	    int temp = data[start];
		data[start] = data[end];
		data[end] = temp;
	  }
	  return;
  }
 
  else if(0 == end - start){
      return;
   }
  else
  {
    Merge_Sort(data, start, (end - start +1)/2 + start, result);
	Merge_Sort(data, (end-start+1)/2+start+1, end,result);
	Merge(data,start,end, result);
	for(int i = start; i <= end; i++)
		data[i] = result[i];
  }
}
void Merge(int *data, int start, int end, int * result)
{
  int left_length =(end -start+1)/2 +1;
  int left_index = start;
  int right_index = start+left_length;
  int result_index = start;
  while(left_index < start+left_length && right_index < end+1)
  {
     if(data[left_index] <= data[right_index])
		 result[result_index++]= data[left_index++];
	 else
		 result[result_index++]= data[right_index++];
  }
  while(left_index < start + left_length)
	  result[result_index++] = data[left_index++];
  while(right_index < end +1)
	  result[result_index++] = data[right_index++];

}
int main()
 {
	 int data[] = {3,4,5,12,2,1};
	 const int length = sizeof(data) / sizeof(data[0]);
	 int result[length] = {0};
	 cout << "Befor Sort: " <<endl;
	 for(int i = 0; i < length; i++)
		 cout << data[i] << " ";
	 cout << endl;
	 cout << "排序後: "<<endl;
	 Merge_Sort(data, 0, length-1, result);
	 for(int i = 0; i < length; i++)
		 cout << data[i] << " ";
	     cout <<endl;
	 return 0;

}


相關推薦

資料結構排序歸併排序

/* *遞迴 歸併排序 */ #include<iostream> using namespace std; void Merge(int *, int , int, int *); void Merge_Sort(int *data, const int st

資料結構】八大排序歸併排序

一.歸併排序的基本思想           歸併排序(MERGE-SORT)是利用歸併的思想實現的排序方法,該演算法採用經典的分治(divide-and-conquer)策略(分治法將問題分(divide)成一些小的問題然後遞迴求解,而治(conquer)的階段則將分的階段

資料結構 筆記:歸併排序和快速排序

歸併排序的基本思想 -將兩個或兩個以上的有序序列合併成一個新的有序序列 template < typename T> static void Merge(T src[] , T helper[],int begin,int mid,int end, bool mi

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

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

常見排序歸併排序

#include <stdio.h>#include <stdlib.h> #define ELEMENT_CNT 10 void merge(int *array,int low,int mid,int high){ int i,k; int left_low = low; in

經典排序歸併排序詳解

歸併排序 一.概述 這裡歸併的含義將兩個或兩個以上的有序表組合成一個新有序表,本文講述二路歸併排序。 二、排序過程 初始序列看成n個有序子序列,每個子序列長度為1 兩兩合併,得到(n/2向下取整數)個長度為2或1的有序子序列 再兩兩合併,重複直至得到一個長度為n的有序序列為止

JavaScript排序歸併排序

1.簡介 歸併排序是建立在歸併操作上的一種有效的排序演算法。該演算法是採用分治法的一個非常典型的應用。歸併排序是一個O(nlogn)的演算法,其基本思想就是一個分治的策略,先進行劃分,然後再進行合併。

python排序歸併排序

思想:先遞歸分解陣列,再合並陣列 程式碼: def merge_sort(alist): n=len(alist) if n<=1: return alist mid=n//2 left_li=merge_sort(a

8大排序 ---------歸併排序 與時間複雜度

                                            歸併排序與時間複雜度 -------------------------- 講歸併排序之前,先講講什麼事遞迴?遞迴就是自己呼叫自己。 比如 f(x)=  x^2+ f(x - 1)且f(

c# 排序歸併排序

程式碼: //歸併排序(目標陣列,子表的起始位置,子表的終止位置) private static void MergeSortFunction(int[] array, int first, int last) { try

經典排序歸併排序(自頂向下、自底向上)

遞迴: void __merge(int arr[], int l, int mid, int r) { int a = r - l + 1; int *aux = new int[a]; for (int i = l; i <= r; i++) aux[i - l] = ar

一步一步搞清排序歸併排序(JAVA)

前言:前面搞定了插入、冒泡、選擇···這些磨人的小妖精,這一次的目標是搞定歸併排序~歸併排序這個東東呢,演算法考試中有遇到過,當時並不能完整無誤的寫出來,學渣屬性曝光~~ 原理:歸併排序是分治法-分而治之最經典的表達。 最基本的思想就是將兩個有序的序列合

資料結構與演算法C++歸併排序(續)

上一篇部落格中實現的是自上以下的歸併排序,自上而下需要先不斷將陣列進行對半拆分(遞迴實現),然後再合併排序 其實也可以自下而上實現歸併排序,這樣使用for迴圈就可以實現,省掉了遞迴的操作 首先對陣列的每一個元素進行兩兩歸併(相鄰的兩個元素合併成一個有序陣列),然後將合併好的兩個元素的有序

資料結構與演算法C++歸併排序

上兩篇部落格使用的選擇排序和插入排序的演算法複雜度都是O(n2),這在陣列元素比較多的時候和一些演算法複雜度為O(nlogn)的快速排序演算法相比,差距還是很明顯的,如下圖 當有10萬個元素的時候,快速排序演算法比普通的選擇排序演算法要快了6000倍, 本篇部落格介紹的是快速排序演算法

排序演算法歸併排序(關鍵詞:資料結構/演算法/排序演算法/歸併排序

假定:有 1 個亂序的數列 nums ,其中有 n 個數。 要求:排好序之後是 從小到大 的順序。 歸併排序演算法 程式碼 def merge(a, b): res = [] A = 0 B = 0 while A<len(a) and B<len(b

資料結構實驗排序五:歸併求逆序數(SDUT 3402)

歸併排序詳解(戳我)。 以下是搬了別人的。 #include<stdio.h> #include<stdlib.h> long long sum = 0; int a[100005]; int temp[100005]; void Merge(int s1

資料結構排序演算法歸併排序(c語言實現)

博主身為大二萌新,第一次學習資料結構,自學到排序的時候,對於書上各種各樣的排序演算法頓覺眼花繚亂,便花了很長的時間盡力把每一個演算法都看懂,但限於水平有限,可能還是理解較淺,於是便將它們逐個地整理實現出來,以便加深理解。 歸併排序就是通過將一個具有n個key記錄的線性表,看

資料結構(26)--排序歸併排序

參考書籍:資料結構(C語言版)嚴蔚敏吳偉民編著清華大學出版社 1 2-路歸併排序     歸併就是將兩個或兩個以上的有序資料序列合併成一個有序資料序列的過程。     採用歸併的思想進行排序—歸併排序。     假設初始序列含有 n個記錄,則可看成是 n個有序的子序列;每個

資料結構和演算法分析排序篇--歸併排序(Merge Sort)和常用排序演算法時間複雜度比較(附贈記憶方法)

歸併排序的基本思想 歸併排序法是將兩個或以上的有序表合併成一個新的有序表,即把待排序序列分成若干個子序列,每個子序列是有序的。然後再把有序子序列合併為整體有序序列。注意:一定要是有序序列! 歸併排序例項: 合併方法: 設r[i……n]由兩個有序子表r

資料結構排序歸併排序

歸併排序(Merging Sort)是與插入排序、交換排序、選擇排序不同的另一類排序方法。歸併的含義時將兩個(二路歸併)或兩個以上(多路歸併)的有序表合併成一個新的有序表。此處只討論二路歸併。 基本思想 將待排序序列r[0]到r[n-1]看成是一個含有n個長