归并排序

7 篇文章 0 订阅
 
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void merge(int * array, int start, int middle, int end)
{
	int nIter=0;
	int nIter1=start;			//a[start]...a[middle]
	int nIter2=middle+1;		//a[middle+1]...a[end]

	int * tempArray=new int[end-start+1];
	memset(tempArray, 0, (end-start+1)*sizeof(int));
	while(nIter1 <= middle && nIter2 <= end)       //访问到其中一段结束为止,另一段剩余部分则直接复制
	{
		if(array[nIter1]<=array[nIter2])
		{
			tempArray[nIter]=array[nIter1];
			nIter1++;
		}
		else
		{
			tempArray[nIter]=array[nIter2];
			nIter2++;
		}
		nIter++;
	}

	for(;nIter1<=middle;nIter1++, nIter++)
		tempArray[nIter]=array[nIter1];

	for(;nIter2<=end;nIter2++, nIter++)
		tempArray[nIter]=array[nIter2];

	int i=0;
	for(; start+i<=end; i++)
		array[start+i]=tempArray[i];
}

void merge_sort(int array[], int start, int end)
{
	if(start==end)
		return;
 	int middle=(end+start)/2;
 	merge_sort(array, start, middle);
	merge_sort(array, middle+1, end);
	merge(array, start, middle, end);
}

void print_array(int array[], int n)
{
	int nIter=0;
	for(; nIter<n; nIter++)
	{
		printf("%d	", array[nIter]);
	}
	printf("\n");
}

void main()
{
	int array[]={0,30,155,1,80,300,170,40,99};
	printf("before sort:\n");
	print_array(array, 9);

	merge_sort(array, 0, 8);
	printf("after sort:\n");
	print_array(array, 9);
}

归并排序所用的时间复杂度为:nlgn

                           空间复杂度为:n

编程时,注意技巧性的东西: 将两个已排序的数组进行合并

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值