选择类排序法——归并排序

原创 2013年12月06日 11:48:12
         归并排序的基本思想是基于合并,将两个或者两个以上的有序表合并成一个新的有序表。归并排序是建立在归并操作上的一种有效的排序操作。该算法是采用分治法的一个典型例子。将已知序列的子序列合并,得到完全有序的序列,即先使每一个子序列有序,再使子序列段间有序,若将两个有序表合并成一个有序表,称为二路归并。

时间效率:归并排序的效率是比较高的,设数列长N,将数列分开成小数列一共要logN步,每步都是一个合并有序列的过程,时间复杂度为O(N),故一共为O(N*logN)

空间效率:在实现归并排序时,需要和待排序记录等记录的辅助空间,空间复杂度为O(N)
        与快速排序和堆排序相比,归并排序的最大特点就是它是一种稳定的排序方法。一般情况下,由于要求附加和待排序记录等数量的辅助空间,因此很少利用2-路归并排序进行内部排序,归并的思想主要用于外部排序。
   外部排序可分为两步,将待排序的记录分批读入内存,用某种方法在内存排序,组成有序的子文件,再存入外存。第二步,将子文件进行多路归并,生成较长有序子文件,再存入外存,如此反复,直到整个待排序文件有序。

示例图:


示例代码:

#include <unistd.h>
#include <assert.h>
#include <stdio.h>
#include <stdlib.h>

#define N 8

/*合并两个相邻的子序列*/
void Merge(int r1[], int low, int mid, int high, int r2[])
{
	int i, j, k;
	i = low;
	j = mid + 1;
	k = low;
	while((i <= mid) && (j <= high))
	{
		if (r1[i] <= r1[j])
		{
			r2[k] = r1[i++];
		}
		else
		{
			r2[k] = r1[j++];
		}
		++k;
	}
	while (i <= mid)
	{
		r2[k] = r1[i];
		k++;
		i++;
	}
	while (j <= high)
	{
		r2[k] = r1[j];
		k++;
		j++;
	}
}

/*2-路归并排序的递归算法*/
void MSort(int r1[], int low, int high, int r3[])
{
	int mid;
	int r2[N];
	if (low == high)
	      r3[low] = r1[low];
	else
	{
		mid = (low + high) / 2;
		MSort(r1, low, mid, r2);
		MSort(r1, mid+1, high, r2);
		Merge(r2, low, mid, high, r3);
	}

}

int main(int argc, char *argv[])
{
	int i;
	int r[N] = {10, 50, 70, 30, 40, 80, 60, 45};
	int b[N];

	MSort(r, 0, N-1, b);

	printf("排序后的结果是:");
	for (i = 0; i < sizeof(r) / sizeof(*r); i++)
	{
		printf("%3d", b[i]);
	}
	printf("\n");
	return 0;
}


相关文章推荐

数据结构——归并排序

  • 2017年06月17日 10:30
  • 34KB
  • 下载

分治法——归并排序

分治法:将原问题划分成n个规模较小而结构与原问题相似的子问题,递归的解决这些子问题,然后再合并其结果,就得到原问题的解。 步骤:分解-》解决-》合并。 归并排序算法分析: 这里我们有一个...

分治法算法——归并排序

分治法算法中的经典——归并排序上一节,我讲了分治法的相关思想,并贴出数字旋转方阵的代码以及解决思想。算法的话,主要还是要靠自己领悟,要多思考,不会再去看看别人的思路。以下,我分析一下分治法算法中的经典...

老生常谈——分治法与归并排序

首先来决一个基本的问题:如何合并两个有序序列?

分治法——归并排序(MergeSort)

分治法的思想:将原问题分解为几个规模较小单类似于原问题的子问题,递归地求解这些子问题,然后再合并这些子问题来建立原问题的解。分治法法在每层递归时都有如下三个步骤:分解原问题为若干子问题,这些子问题是原...

归并排序法

  • 2013年05月02日 16:23
  • 2KB
  • 下载

常用排序算法——归并排序法

归并排序采用的是分治思想,将数组不断分解为子数组,直到子数组只有一个元素,每次分解对应一个归并函数,归并函数可以将当前分解的两个子数组合并起来。有两种方式可以实现归并排序,第一种是递归方式实现的,代码...
  • girlkoo
  • girlkoo
  • 2013年12月27日 10:11
  • 3202

选择排序及归并排序

  • 2012年11月20日 08:32
  • 1.51MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:选择类排序法——归并排序
举报原因:
原因补充:

(最多只允许输入30个字)