33. 归并排序(迭代)

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<ctime>

using namespace std;

#define MAXSIZE 10
const int n = MAXSIZE;

int num[n];
void init()
{
	for (int i = 0; i < n; i++) num[i] = rand() % 100;//产生MAXSIZE(10)个数据 数据范围为0~~~99;
}

void output()
{
	for (int i = 0; i < n; i++)
	{
		printf("%d   ", num[i]);
		//if (i % 10 == 9) printf("\n");
	}
	printf("\n");
}
;

///归并排序(迭代)  order by asc
void merge(int num[], int l, int m, int n, int extra[])
{//将为l....m和 m+1.....n 的两个序列 归并为一个有序序列  
	int j, k, i;
	j = l;
	k = m + 1;
	i = j;
	while (j <= m && k <= n)
	{
		if (num[j] < num[k]) extra[i++] = num[j++];
		else extra[i++] = num[k++];
	}
	while (j <= m) extra[i++] = num[j++];
	while (k <= n) extra[i++] = num[k++];

	for (i = l; i <= n; i++)
	{
		num[i] = extra[i];
	}
}
void merge_pass(int num[],int n,int extra[],int lengh)
{
	int i, j;
	for (i = 0; i < n - 2 * lengh; i += 2 * lengh)   merge(num, i, i + lengh - 1, i + 2 * lengh-1, extra);

	if (i + lengh < n)		merge(num, i, i + lengh - 1, n - 1, extra);

}


void merge_sort(int num[],int n)
{

	int lengh = 1;
	int extra[MAXSIZE];

	while (lengh < n)
	{
		
		merge_pass(num, n, extra, lengh);

		lengh *= 2;
	}
}

void check()
{
	int flag=1;
	for (int i = 0; i < n - 1; i++)
	{
		if (num[i] < num[i + 1]) continue;
		else { flag = 0; break; }
	}
	if (flag) printf("correct sort\n");
	else printf("something wrong!\n");
}



int main()
{

	srand((unsigned)time(NULL));
	init();
	output();
	//

	printf("迭代排序:\n");
	merge_sort(num, n);
	;
	/
	output();
	check();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值