并归排序

#include <stdio.h>
#include <stdlib.h>
#define SIZE 10

void merge(int array[], int min, int max, int temp[]);	//递归
void mergesort(int a[], int first, int mid, int last, int temp[]); //合并交换排序
void Mergesort(int array[], int n); //创建临时内存空间

int main(void)
{

	int array[SIZE] = { 43, 6, 3, 26, 2, 7, 2, 9, 5, 7 };
	Mergesort(array, SIZE);
	for (int n = 0; n < SIZE; n++)	//打印排序完后的临时数组
		printf("%d,", array[n]);

	return 0;
}

void mergesort(int array[], int min, int mid, int max, int temp[]) {
	int i = 0;
	int left_begin = min;	//25-28行是确定分割为两个小数组的元素范围
	int left_end = mid;		//前面的区间范围
	int right_begin = mid + 1;
	int right_end = max;	//后面的区间范围
	while (left_begin <= left_end&&right_begin <= right_end) {	//判断比较大小,并赋给临时数组
		if (array[left_begin] <= array[right_begin])
			temp[i++] = array[left_begin++];
		else
			temp[i++] = array[right_begin++];
	}

	while (left_begin <= left_end)	//把上面还没循环完毕的数组,中剩下的元素直接取出放入temp数组
		temp[i++] = array[left_begin++];
	while (right_begin <= right_end)
		temp[i++] = array[right_begin++];

	for (int n = 0; n < i; n++)	//把排序好临时的值再放回原先数组中
		array[min+n] = temp[n];


}

void merge(int array[], int min, int max, int temp[]) {
	if (min < max){		//这里不理解可以用VS2013看,设置断点,然后启动调试->窗口,把局部变量之类的窗口调出来,一看就明白
		int mid = (min + max) / 2;
		merge(array, min, mid, temp);
		merge(array, mid + 1, max, temp);
		mergesort(array, min, mid, max, temp);
	}
}

//创建临时数组
void Mergesort(int array[], int n){
	int *p = (int*)malloc(SIZE*sizeof(int));
	if (p != NULL){
		merge(array, 0, SIZE - 1, p);
		free(p);
	}
	else
		printf("sorry,please debug");
}
热烈欢迎各种批评、指正、讨论,经常在线
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值