排序算法——归并排序

“归并”一词在中文含义中就是合并的意思,而在数据结构中的定义是将两个或者两个以上的有序表组合成一个新的有序表,就叫归并。

这个算法的思路基于如下事实:假设我已经有两个有序的数组,我肯定是可以把它们插在一起,变成一个有序的大数组的。

所以这个算法分为两步:

1.“归”。将一个大数组不停的分解,直到剩下2个元素,然后我会对它们排序。

2.“并”。将两个排好序的2个元素的数组(或者是一个2个元素,一个1个元素)合并成一个有序的大数组。依次类推。

时间复杂度:O(nlogn)  稳定

归并排序(递归实现) 

归并排序(Merge Sort)就是利用归并的思想实现的排序方法。它的原理是假设初始序列有n个记录,则可以看成是n个有序的子序列,每个子序列的长度为1,然后两两归并,得到⌈n/2⌉个长度为2或1的有序子序列;再两两归并,……,如此重复,直至得到一个长度为n的有序序列为止,这种排序方法称为2路归并排序。

//归并排序(递归操作)
#include "stdafx.h"
#include<stdio.h>

#define MAXSIZE 10

//实现归并,把最后的结果存放在list1中
void merging(int *list1, int list1_size, int *list2, int list2_size)
{
	int i, j, k;
	int temp[MAXSIZE];//临时数组

	i = j = k = 0;

	while (i<list1_size&&j<list2_size)
	{
		if (list1[i]<list2[j])
		{
			temp[k++] = list1[i++];
		}
		else
		{
			temp[k++] = list2[j++];
		}
	}
	while (i<list1_size)
	{
		temp[k++] = list1[i++];
	}
	while (j<list2_size)
	{
		temp[k++] = list2[j++];
	}
	for (int m = 0; m < (list1_size + list2_size); m++)
	{
		list1[m] = temp[m];
	}
}

void MergeSort(int k[], int n)
{
	if (n > 1)
	{
		int *list1 = k;
		int list1_size = n / 2;
		int *list2 = k + n / 2;
		int list2_size = n - list1_size;

		MergeSort(list1, list1_size);
		MergeSort(list2, list2_size);

		merging(list1, list1_size, list2, list2_size);
	}
	
}
int main()
{
	int i, a[10] = { 5, 2, 6, 0, 3, 9, 1, 7, 4, 8 };

	MergeSort(a, 10);
	printf("排序后的结果是:");
	for (i = 0; i<10; i++)
	{
		printf("%d", a[i]);
	}
	printf("\n");

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值