【数据结构与算法】排序算法之五:归并排序

一  归并排序

1 基本思想

归并排序和堆排序一样用到了完全二叉树。

古语有云:破而后立。归并排序的思想就是如此。其步骤如下:

(1)  将待排序数组按”二分“的规则”打破“,一直到子数组的长度为1为止

(2)  ”立“的过程就是将子数组两两归并成有序数组,如此重复,直到得到按序排列的数组。

2   实现

首先,我们来看”打破“的代码。

void Merge_Sort(SortArray *A , int first  , int last)
{
	if (first  < last)   //当first == last 即退出循环
	{
		int mid = (first + last)/2 +1;
		//递归
		Merge_Sort(A , first , mid -1); //将数组一分为二 子数组:[first....mid -1]
		Merge_Sort(A , mid , last);		//子数组[mid....last]
		merge(A , first , mid , last);
	}
}
”立“的代码则是merge , 下面就是merge的函数代码:

void merge(SortArray *A, int first , int mid , int last)
{
	int i , j ,k ;
	int B[MAX];//用于做临时数组,保存排序后的数组片段
	for (i = first, j = mid , k = first ; i < mid && j <= last ; k++)
	{
		//选择最小的值
		if ((*A)[i] < (*A)[j])
		{
			B[k] = (*A)[i];
			i++;
		}
		else 
		{
			B[k] = (*A)[j];
			j++;
		}
	}
	//将数组中剩余的数补齐
	//补齐[i....mid]
	while ( i < mid)
	{
		B[k++] = (*A)[i];
		i++;
	}
	//补齐[j....last]
	while ( j <= last)
	{
		B[k++] = (*A)[j];
		j++;
	}
	//将临时数组值传递给A
	for (i = first ; i <= last ; i++)
	{
		(*A)[i] = B[i];
	}
}
本算法中采用临时数组B[max]来存储排序后的算法,虽然增加的算法复杂度,但是有效的减少了内存消耗。也是一种用时间换空间的做法。




下面附上主程序代码:

#include <stdio.h>
#include "stdafx.h"
#include <iostream> 
using namespace std;

#define MAX 100
typedef int SortArray[MAX];

int _tmain(int argc, _TCHAR* argv[])
{
	int n ;
	SortArray A;                                                                                                                                      
	cout<<"/**排序**/\n"
	<<"请输入数组个数"<<endl;
	cin>>n;
	cout<<"请输入待排序数组"<<endl;
	for (int i = 0 ; i < n ; i++)
	{
		cin>>A[i];
	}
	cout<<"正在排序请稍后....."<<endl;
	Merge_Sort(&A , 0 , n-1);
	cout<<"排序结果如下....."<<endl;
	for (int i = 0 ; i < n ; i++)
	{
		cout<<A[i]<<endl;
	}
	system("pause");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值