二路归并排序

来源:互联网 发布:土豆客户端 mac 编辑:程序博客网 时间:2024/06/01 12:59

二路归并排序的核心思想是对两个已排序的子序列进行两两归并合成一个子序列的过程。它是利用分治法求解的一个典型应用。设归并排序的当前区间是R[low..high],二路归并排序的主要步骤如下:

1 将当前区间一分为二。

2 分别对左右区间排序。

3 对左右区间执行归并操作。

其中归并操作的具体过程如下:

首先申请辅助空间,将两个子序列相邻地复制到辅助空间中,然后依次在辅助空间中从左右区间取值将二者中的最小者放入原数组中,将最小值所在的区间的指针向后移动,然后依次进行比较。当某一区间的指针指向序列尾部时,将另一区间余下的数复制到原数组中。

二路归并的时间复杂度为O(nlogn),并且由于二路归并并不改变相同元素的相对位置,因此它是一种稳定的排序。

// ConsoleApplication54.cpp : 定义控制台应用程序的入口点。//二路归并排序#include "stdafx.h"#include<iostream>#include<string>using namespace std;void Merge(int a[], int low, int mid, int high);void MergeSort(int a[], int low, int high){if (low < high){int mid = (low + high) / 2;MergeSort(a, low, mid);MergeSort(a, mid + 1, high);Merge(a, low, mid, high);}}void Merge(int a[], int low, int mid, int high){//int *b = (int *)malloc(sizeof(int)*(high - low + 1));int b[100];int j;int k;for ( k = low; k <= high; k++){b[k] = a[k];}int i ;for (k = low, j = mid + 1,i=k; k <= mid &&j <= high;i++){if (b[j] < b[k]){a[i] = b[j++];}else{a[i] = b[k++];}}while (k <= mid)a[i++] = b[k++];while (j <= high)a[i++] = b[j++];}void test(int a[], int low, int high){MergeSort(a, low, high);for (int i = low; i <= high; i++)cout << a[i] << " ";}int _tmain(int argc, _TCHAR* argv[]){int a[7] = {2,4,3,14,12,8,5};test(a, 0, 6);system("pause");return 0;}


0 0
原创粉丝点击