数据结构中的排序--归并(merge)排序

19 篇文章 0 订阅
9 篇文章 0 订阅

以下的图片来自网络资料:https://www.jianshu.com/p/33cffa1ce613

归并排序的思路图示:

合并两个有序数列的流程思路:

C语言的实现代码:

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

void print(int data[], int n)
{
	for (int i = 0; i < n; i++)
	{
		cout << data[i] << " ";
	}
	cout << endl;
}

void merge(int data[], int tmp[], int lpos, int rpos, int rend)
{
	int i, lend, num, tmppos;
	lend = rpos - 1;
	tmppos = lpos;
	num = rend - lpos + 1;

	while (lpos <= lend && rpos <= rend)
	{
		if (data[lpos] <= data[rpos])
			tmp[tmppos++] = data[lpos++];
		else
			tmp[tmppos++] = data[rpos++];
	}
	while (lpos <= lend)
		tmp[tmppos++] = data[lpos++];
	while (rpos <= rend)
		tmp[tmppos++] = data[rpos++];

	for (i = 0; i < num; i++, rend--)
	{
		data[rend] = tmp[rend];
	}
}

void merge_sort(int data[], int tmp[], int low, int high)
{
	if (low >= high)
	{
		return;
	}
	int middle = (low + high) / 2;
	merge_sort(data,tmp, low,middle);
	merge_sort(data, tmp, middle + 1, high);

	merge(data, tmp, low, middle+1, high);

}

void merge_ascending_sort(int data[], int len)
{
	int i = 0, j = 0, x = 0;

	int *tmp = NULL;
	tmp = new int[len];
	if (NULL != tmp)
	{
		merge_sort(data, tmp, 0, len-1);
		delete[]tmp;
	}
}

void merge_des(int data[], int tmp[], int lpos, int rpos, int rend)
{
	int i, lend, num, tmppos;
	lend = rpos - 1;
	tmppos = lpos;
	num = rend - lpos + 1;

	while (lpos <= lend && rpos <= rend)
	{
		if (data[lpos] <= data[rpos])
			tmp[tmppos++] = data[rpos++];
		else
			tmp[tmppos++] = data[lpos++];
	}
	while (lpos <= lend)
		tmp[tmppos++] = data[lpos++];
	while (rpos <= rend)
		tmp[tmppos++] = data[rpos++];

	for (i = 0; i < num; i++, rend--)
	{
		data[rend] = tmp[rend];
	}
}

void merge_dessort(int data[], int tmp[], int low, int high)
{
	if (low >= high)
	{
		return;
	}
	int middle = (low + high) / 2;
	merge_dessort(data, tmp, low, middle);
	merge_dessort(data, tmp, middle + 1, high);

	merge_des(data, tmp, low, middle + 1, high);

}

void merge_desending_sort(int data[], int len)
{

	int i = 0, j = 0, x = 0;

	int *tmp = NULL;
	tmp = new int[len];
	if (NULL != tmp)
	{
		merge_dessort(data, tmp, 0, len - 1);
		delete[]tmp;
	}

}


int main()
{
	int num[] = {5,3, 7,4,3,9,6,2,10,4,3,7,1};
	int len = sizeof(num) / sizeof(int);

	cout << "data count:"<< len << ".  before sort: ";
	print(num, len);

	merge_ascending_sort(num, len);
	cout << "after ascending sort: ";
	print(num, len);

	merge_desending_sort(num, len);
	cout << "after desending sort: ";
	print(num, len);

	return 0;
}

测试结果:

data count:13.  before sort: 5 3 7 4 3 9 6 2 10 4 3 7 1
after ascending sort: 1 2 3 3 3 4 4 5 6 7 7 9 10
after desending sort: 10 9 7 7 6 5 4 4 3 3 3 2 1
请按任意键继续. . .

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值