归并排序是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(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