1. 程式人生 > >排序之合併排序

排序之合併排序

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<time.h>
#include<iostream>
using namespace std;
//
void PrintArr(int *pnArr, int nlen)
{
	for (int i = 0; i < nlen; i++)
	{
		cout << pnArr[i] << endl;;
	}
	cout << endl;
}

//void Merge(int data[], int nLpos, int nRpos, int nRightEnd)
//{
//	int i;
//	int k = nLpos;
//	int nLeftEnd = nRpos;
//	int nTmpos = 0;
//	int nLen = nRightEnd - nLpos + 1;
//	//int *pnArr = (int *)malloc(sizeof(int)* nLen);
//	int *pnArr = new int[nLen];
//	++nRpos;
//
//	while (nLpos <= nLeftEnd && nRpos <= nRightEnd)
//	{
//		if (data[nLpos] <= data[nRpos])
//			pnArr[nTmpos++] = data[nLpos++];
//		else
//			pnArr[nTmpos++] = data[nRpos++];
//	}
//	while (nLpos <= nLeftEnd)
//		pnArr[nTmpos++] = data[nLpos++];
//	while (nRpos <= nRightEnd)
//		pnArr[nTmpos++] = data[nRpos++];
//
//	nTmpos = 0;
//	for (i = k; i <= nRightEnd; i++)
//		data[i] = pnArr[nTmpos++];
//
//	//free(pnArr);
//	delete pnArr;
//}
//void MergeSort(int *pnArr, int nLeft, int nRight)
//{
//	if (nLeft > nRight)
//		return;
//	if (nRight > nLeft)
//	{
//		int nMid = (nLeft + nRight) / 2;
//		MergeSort(pnArr, nLeft, nMid);
//		MergeSort(pnArr, nMid + 1, nRight);
//		Merge(pnArr, nLeft, nMid, nRight);
//	}
//}



void Merge(int arr[], int i, int j, int k)
{
    int h = i; //  這一步是易錯點 主要是記錄arr陣列剛開始排序的位置,在下面的賦值中可以用到
	int nLen = k- i + 1;
	int* tmep = new int[nLen];
	int x = 0;
	int start = i, end = k;
	int nLeftEnd = j;
    int Rbegin = j+1;
	while (start <= nLeftEnd && Rbegin <= end)
	{
		if (arr[start] <= arr[Rbegin])
			tmep[x++] = arr[start++];
		else
			tmep[x++] = arr[Rbegin++];
	}
	while (start <= nLeftEnd)
		tmep[x++] = arr[start++];
	while (Rbegin <= end)
		tmep[x++] = arr[Rbegin++];

	x = 0;
	for (int j = i; j <= end; j++)// 把排好序的陣列重新賦值給arr
		arr[j] = tmep[x++];

	delete tmep;

}
void MergeSort(int *arr, int start, int end)
{
	if (start > end)
		return;
	if (end > start)
	{
		int middle = (start + end) / 2;
		MergeSort(arr,start, middle);
		MergeSort(arr, middle+1, end);
		Merge(arr,start,middle,end);
	}
}

int main()
{
	srand(time(nullptr));
	int nArr[10];
	for (int i = 0; i < 10; i++)
		nArr[i] = rand() % 100;
	cout << "排序前:" << endl;
	PrintArr(nArr, 10);
	MergeSort(nArr, 0, 9);
	cout << "排序後" <<endl;
	PrintArr(nArr,10);
	system("pause");
	return 0;
}

相關推薦

資料結構排序合併排序

合併排序是用分治策略的一個排序演算法。 其基本思想是將待排序元素分成大小大致相同的兩個子序列,對兩個子序列進行排序後,再進行合併。 通俗來講,待排序元素不停的分解與合併,這是一個重複且相似的過程。 假設有n個元素,我們將其劃分兩半,再對其中的一部分再劃分兩半,重複此

排序合併排序

#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<time.h> #include<iostream> using namespace

一步一步寫演算法 合併排序

                【 宣告:版權所有,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】    前面一篇部落格提到的快速排序是排序演算法中的一種經典演算法。和快速排序一樣,合併排序是另外一種經常使用的排序演算法。那麼合併排序演算法有什麼不同呢?關鍵之處就體現在這

分治法合併排序(C實現)

#include <stdio.h> void merge(int a[],int p,int q,int r) { int n1=q-p+1,n2=r-q; int

C語言合併排序

一、基本運算: 兩路合併排序:將兩個有序序列合併成一個有序序列。 二、步驟: ①把待排序的序列分成長度為1的子序列(只包含一個記錄的序列被認為是有序的)→得到n個長度為1的有序子序列; ②實施兩兩合併,合併相鄰的兩個子序列→得到大約n/2個長度為2的有序子序列; ③重複步驟

Java練習:分治法合併排序(merge Sort)

分而治之(divide-and-conquer)是一種古老但實用的策略、普適性的問題求解策略。本質上,分而治之策略是將整體分解成部分的思想。 按照系統科學的觀點,該策略僅適用於線性系統——整體正好對於部分之和。 (兩路)合併排序遵循分治法的三個步驟,其操作如下: (1

分治法合併排序演算法理解介紹

    複習分治法,藉著這個機會將用到分治法的合併排序和快速排序演算法好好梳理一下並作出總結。     分治法求解問題的三要素是分解、求解、合併。分解是指將一個難以直接求解的複雜問題按照某種方式分解成若干個規模較小、相互獨立且和原問題型別相同的子問題,求解是指子問題分解至可

一步一步寫演算法(合併排序

【 宣告:版權所有,歡迎轉載,請勿用於商業用途。  聯絡信箱:feixiaoxing @163.com】     前面一篇部落格提到的快速排序是排序演算法中的一種經典演算法。和快速排序一樣,合併排序是另外一種經常使用的排序演算法。那麼合併排序演算法有什麼不同呢?關鍵之處就

c語言合併排序實現

#include <stdio.h> #include <stdlib.h> #include <string.h> //將兩個有序序列合併為一個有序序列 void merge(int a[],int left_pos,int right

Java語言描述:遞迴與分治策略合併排序與快速排序

合併排序: package DivideAndConquer; public class MergeSort { //一定要多傳入一個多餘的temp陣列用於存放排序的中間結果 public static<AnyType extends Comparable&l

js演算法:分治法-歸併排序合併有序陣列

     合併有序陣列是合併排序重要的一步,下面js演示了每一步的操作過程  附程式碼: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> <HTML> <HEA

排序演算法——合併排序/歸併排序(Java實現)

        今天,來講一講合併排序,其實我已經寫了 堆排序 和 快速排序,本來都不想寫這個,但是,當我發現我身邊很多人竟然都不知道這個排序的時候,我震驚了,畢竟,這是一個經典的入門演算法(反正外國貌似是這樣的,根據我看的書和視訊),歷史也十分悠久。下面就來講講這歷史悠久

排序快速排序

技術分享 復雜 partition 規則 作用 快速排序 iterator 排序規則 cto 快速排序的在內排中起到比較重要的作用,平均時間復雜度達到O(nlogn)。 升序快速排序 1 int partition(vector<int> &vi,

6.比較排序快速排序

python 大於 -s 數組元素 span pac .com quicksort image   快速排序(簡稱快排)因為其效率較高(平均O(nlogn))經常在筆試題中對其考查。   對於快排的第一步是選取一個“基數”,將會用這個“

常用排序選擇排序

length stat sort simple out blog 一個 i++ string 算法簡介:      選擇排序就是每一趟選擇最小或者最大的數,然後與起始位置進行交換。 實現思路:      1、從第一個數開始,找到最小或者最大的數,與第一個數進行交換。

交換排序冒泡排序和快速排序

優秀 這就是 它的 效率比較 密碼 false 鏈接 特殊 應用 交換排序 所謂交換,就是根據序列中兩個記錄鍵值的比較結果來對換這兩個記錄在序列中的位置,交換排序的特點是:將鍵值較大的記錄向序列的尾部移動,鍵值較小的記錄向序列的前部移動。 排序入門之冒泡排序 冒泡排序

選擇排序排序

swa 小根堆 二叉樹 輸出 完全 意義 跳出循環 堆排 ++ /* * 選擇排序之堆排序 * 按照完全二叉樹的順序存儲方式,建立一顆完全二叉樹 * 若是大根堆:l(i)>=l(2*i),l(i)>=l(2*i+1) * 若是小根堆:l(i)&

排序基數排序

算法 大小 ble 這一 index eof sta 根據 next 基數排序也是一種不基於比較的排序方法,它的思想是這樣的:假設有m個數據,先根據個位數大小對這m個數據進行排序,得到一個新的序列;然後根據十位數大小對這m個數據進行排序,又得到一個新的序列;然後再根據百位、

八大排序快速排序算法-python實現

com 現在 主函數 port 右移 們的 冒泡 實現 odin 快排就是折中時間和空間的一個算法,可以說是較為高效的算法,平時用用他沒啥大問題。 自己也看到個比較形象生動的例子,為了讓大家能夠看的比較清楚,我就直接轉過來給大家看了哈!但是我使用python實現的: 註意以

內部排序快速排序

ref i+1 tar ret 遞歸調用 互換 int nbsp oid 設要排序的數組是A[0]……A[N-1],首先任意選取一個數據(通常選用數組的第一個數)作為關鍵數據,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一趟快速排序。值得註意的