码迷,mamicode.com
首页 > 编程语言 > 详细

【排序算法】归并排序

时间:2015-06-23 13:37:15      阅读:133      评论:0      收藏:0      [点我收藏+]

标签:归并排序   排序算法   递归   合并   算法   

归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。


归并操作的工作原理如下:

申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列

设定两个指针,最初位置分别为两个已经排序序列的起始位置

比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置

重复步骤3直到某一指针达到序列尾

将另一序列剩下的所有元素直接复制到合并序列尾



代码如下:

/********************************************************************************

** auth: Vincent Lau

** mail:  985632368@qq.com

** date: 2015.6.22 

** desc: 

** Ver : V1.0.0 

*********************************************************************************/

#include<iostream>
#define SIZE 21  
#include<list>
typedef int Sqlist[SIZE];

using namespace std;


//====================================Merge()===================================
/// @brief <对函数进行概括说明>  合并
///
/// <对函数进行详细说明>

///
/// @remark <函数特别说明>  将数组中连续的两个子序列合并为一个有序序列 
//================================================================================
void Merge(Sqlist &L, int left, int mid, int right)
{
	Sqlist L1;					//开辟等大空间
	
	for (int i = 0; i < SIZE; ++i)
	{
		L1[i] = L[i];
	}
	int s1 = left;
	int s2 = mid+1;
	int k = left;

	while (s1 <= mid && s2 <= right)		//左右有序两部分合并
	{
		if (L1[s1] < L1[s2])
			L[k++] = L1[s1++];
		else
			L[k++] = L1[s2++];
	}
		while (s1 <= mid)				//长度不同的情况
		{
			L[k++] = L1[s1++];
		}
		while (s2 <= right)
		{
			L[k++] = L1[s2++];
		}
}

//==================================MergeSort()=================================
/// @brief <对函数进行概括说明>  MergeSort
///
/// @remark <函数特别说明>  自底向上的归并排序
///

/// @sa <可以参考的类或函数,用空格分隔,函数名称后必须加()>  Merge()
//================================================================================
void MergeSort(Sqlist &L, int left, int right)
{
	if (left >= right)
		return;

	int mid = (left + right) / 2;

	MergeSort(L,left,mid);			//递归左部分排序
	MergeSort(L, mid+1, right);		//递归右部分排序
	Merge(L,left, mid, right);		//合并


}

void main(void)
{
	Sqlist L = { 49, 38, 65, 97, 76, 13, 27, 49 };

	cout << "原数组为:" << endl;

	for (int i = 0; i < 8; ++i)
	{
		cout << L[i] << " ";
	}
	cout << endl;

	MergeSort(L, 0, 7);

	cout << "归并排序:" << endl;

	for (int i = 0; i < 8; ++i)
	{
		cout << L[i] << " ";
	}
	cout << endl;
}


运行结果:


技术分享

【排序算法】归并排序

标签:归并排序   排序算法   递归   合并   算法   

原文地址:http://blog.csdn.net/irean_lau/article/details/46604371

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!