算法学习之合并排序算法

这篇博客介绍了合并排序算法的详细步骤,包括数据串的分解、解决和合并。通过实例展示了如何将数据串【1 3 6 2 4 8 5 3 9 8 7 10】逐步排序。在分解过程中,数据串被拆分成单个元素,然后逐步合并并比较大小,最终完成排序。文章还提到,递归在算法中的关键作用,递归停止的条件是数据串被分割至只有一个元素。
摘要由CSDN通过智能技术生成

合并排序算法,总共分三步:

1、分解:分解数据串,将数据串分解成若干个小型的数据串,最小单位为每个数据串中只有1个数据;

2、解决:也就是比较数据大小;

3、合并:将已经排序好的若干个小型数据串合并为最终数据串;


例如排序如下数据串【1 3 6 2 4 8 5 3 9 8 7 10】:

1、分解数据串,将分解为最小单元:

[1] [3] [6] [2] [4] [8] [5] [3] [9] [8] [7] [10]

2、解决并且合并:

[1 3]  [2 6]  [4 8]  [3 5]  [8 9]  [7 10]

3、继续解决并且合并数据串:[1 2 3 6]   [3 4 5 8]   [7 8 9 10]

4、继续:[1 2 3 6] 和 [3 4 5 7 8 8 910]

5、最后一步了,吼吼:[1 2 3 3 4 5 6 7 8 8 9 10]


合并排序算法,需要我们一直分割数据串,所以需要用递归。那么问题就来了,使用递归的时候,什么时候停止递归就是比较重要的了。当将数据串分割到只有一个单元,即:_beginIndex >= _endIndex时,Stop!

代码如下,欢迎请教:

<span style="font-family:SimHei;font-size:18px;">/*
*@ filename : merge-sort.cpp
*@ time : 2015 - 01 - 16
*
*/

#include "stdafx.h"

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define TEST

void merge_insert(int *pArr, int _begin, int _middle, int _end)
{
	if (pArr == NULL)
		return;

	int LArrLength = _middle - _begin + 1;
	int RArrLength = _end - _middle;
	int AllArrLength = _end - _begin + 1;
	
	printf("LArrLength = %d, RArrLength = %d, AllArrLength = %d.\n", LArrLength, RArrLength, AllArrLength);

	if (LArrLength <= 0 || RArrLength <= 0)
		return;

	int *pLArr = new int[LArrLength];
	int *pRArr = new int[RArrLength];

	if (pLArr == NULL || pRArr == NULL)
		return;

	//copy from pArr
	for (int i = 0; i != LArrLength; i++)
	{
		pLArr[i] = *(pArr + _begin - 1 + i);
	}

	for (int j = 0; j != RArrLength; j++)
	{
		pRArr[j] = *(pArr + _middle + j);
	}

	//Test
#ifdef TEST
	for (int i = 0; i != LArrLength; i++)
	{
		printf("%d\t", pLArr[i]);
	}

	printf("\n");

	for (int j = 0; j != RArrLength; j++)
	{
		printf("%d\t", pRArr[j]);
	}
	printf("\n");
#endif
	//sort pLArr and pRArr

	int LIndex = 0; 
	int RIndex = 0;
	int index = 0;
	
	while (LIndex < LArrLength && RIndex < RArrLength && index < AllArrLength)
	{
		if (pLArr[LIndex] < pRArr[RIndex])
		{
			*(pArr + _begin - 1 + index) = pLArr[LIndex];
			LIndex++;
			index ++;
		}
		else if (pLArr[LIndex] >= pRArr[RIndex])
		{
			*(pArr + _begin - 1+ index) = pRArr[RIndex];
			RIndex++;
			index ++;
		}
	}
	
	if (index < AllArrLength)
	{
		while (LIndex < LArrLength)
		{
			*(pArr + _begin - 1 + index) =  pLArr[LIndex];
			LIndex++;
			index ++;
		}
		while(RIndex < RArrLength)
		{
			*(pArr + _begin  - 1+ index) = pRArr[RIndex];
			RIndex++;
			index ++;
		}
	}
	
	delete [] pLArr;
	delete [] pRArr;
	return;
}

void merge_sort(int *_pArr, int _begin, int _end)
{
	if (_begin < _end)
	{
		int middle = (_begin + _end) / 2;
		merge_sort(_pArr, _begin, middle);
		merge_sort(_pArr, middle + 1, _end);
		merge_insert(_pArr, _begin, middle, _end);
	}
}


int _tmain(int argc, _TCHAR* argv[])
{	
	int arr[] = {1, 3, 2, 6, 1, 2, 5, 3, 7, 8, 7};

	merge_sort(arr, 1,  sizeof(arr)/4);

#ifdef TEST
	for (int i = 0; i != sizeof(arr) / 4; i++)
	{
		printf("%d\t", arr[i]);
	}
	printf("\n");
#endif
	return 0;
}
</span>


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值