归并排序

#include <stdio.h>




//合并算法
void merge_sort_recursive(int arr[],int start,int end,int reg[])
{
	if(start >= end) return;
	int len = end - start;//数组长度
	int mid = (len >> 1) + start ;

	int start1 = start;
	int end1 = mid;

	int start2 = mid + 1;
	int end2 = end;	

	//一半
	merge_sort_recursive(arr,start1,end1,reg);
	//另一半
	merge_sort_recursive(arr,start2,end2,reg);

	int k =start;
	//合并
	while(start1 <= end1 && start2 <= end2){
		if(arr[start1] < arr[start2]){
			reg[k++] = arr[start1++];
		}else{
			reg[k++] = arr[start2++];
		}	
	}
	//把剩余的复制到reg
	while(start1 <= end1){
		reg[k++] = arr[start1++];
	}

	while(start2 <= end2){
		reg[k++] = arr[start2++];
	}
	//把原来的arr覆盖一下
	//printf("start=%d,end=%d:\n");
	for(k = start;k<= end;k++){
		arr[k] = reg[k];
		printf("k=%d reg[k]=%d ",k,reg[k]);
	}
	printf("\n");
	
	
}


void merge_sort(int arr[],int len)
{
	int reg[len];
	merge_sort_recursive(arr,0,len -1,reg);
	//int i;
	//for(i = 0;i< len;i++){
	//	printf("%d ",reg[i]);
	//}
	printf("\n");
}


int min(int x,int y)
{
	return x < y ? x : y;
}

//迭代法
void merge_sort(int arr[],int len)
{
	int sed,start;
	int *b = (int*)malloc( len * sizeof(int));
	int *a = arr;
	for(sed = 1;sed<len;sed +=sed){ //合并数组的长度
		//合并的循环
		for(start = 0;start < len;start += sed * 2){//处理2个数的队列,4个数的队列,8个数的队列
			int low = start;
			int mid = min(start + sed,len);
			int high = min(start + sed * 2,len);

			int start1 = low;
			int end1 = mid;

			int start2 = mid;
			int end2 = high;

			int k = low;
			while(start1 < end1 && start2 < end2){
				if(a[start1] < a[start2]){
					b[k++] = a[start1++]
				}else{
					b[k++] = a[start2++];
				}				
			}
			while(start1 < end1){
				b[k++] = a[start1++];
			}
			while(start2 < end2){
				b[k++] = a[start2];
			}

		}
		int* tem = a;
		a = b;    //将已经排好二个元素的序列赋值给a,继续下一次合并
		b = a;
	}
	if(a != arr){ //那么a指向B b指向arr
		int i;
		for(i = 0;i<len;i++){
			b[i] = a[i]
		}
		b = a;
	}	
	free(b);

}







int main()
{

	int arr[10];
	int i;
	for(i =0;i<10;i++){
		if(i%2)
			arr[i] = i + 2;
		else
			arr[i] = i - 2;
	}

	for(i = 0;i<10;i++){
		printf("%d ",arr[i]);
	}
	printf("\n排序之后的:\n");
	
	merge_sort(arr,10);
	
	for( i =0;i<10;i++){
		printf("%d ",arr[i]);
	}
	printf("\n");

	
	return 0;
}



















 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值