PAT 1035.插入与归并排序

啊之前在大学MOOC上排序的时候课后作业就是这个 一直没写 然后按部就班刷题刷到这里了


自己辣鸡的思路:排一趟比较一趟,插入确实可以这样!但是归并在电脑上的实行机制不是想象中的那样的!!!!在电脑上是把左边全部排完再排右边,所以这个方法行不通,所以归并这里需要修改


小姐姐的思路:点击打开链接


第一:先遍历一遍B数组,找到还未交换的那个数(即前面比后面大的那个数),i赋值为这个数的位置


第二:从这个数后面一个数开始遍历,判断a数组和b数组是否相等,如果相等j++


第三:判断 j是否等于n

如果相等则是插入排序

不相等则是归并排序


第四:对于插入排序

sort(a,a+i+2)

第五:归并排序

两个两个排

到四个四个排

到八个八个排


int k=1;
		int flag= 1;
		while(flag)
		{
			flag = 0;
			for(i=0;i<n;i++)
			{
				if(a[i]!=b[i])
				flag = 1;
			} 
			k = k*2;
			for(i=0;i<n/k;i++)
			{
				sort(a+i*k,a+(i+1)*k,cmp);
			}
		
			sort(a+n/k*k,a+n,cmp);


完整code:

#include<iostream>
#include<algorithm>
using namespace std;
int cmp(int a,int b)
{
	return a<b;
} 
 
int main()
{
	int n;
	int i,j;
	cin >> n;
	int *a = new int [n];
	int *b = new int [n];
	for(i=0;i<n;i++)
	{
		cin >> a[i];
	}
	
	for(i=0;i<n;i++)
	{
		cin >> b[i];
	}
	
	for(i=0; i<n-1 && b[i]<=b[i+1]; i++);//找到还未交换的那个数 
	//cout << i << endl<< endl; 
	
	for(j=i+1;a[j]==b[j] && j<n;j++);//判断这个数后面的是否跟初始数字相等 
//	cout << j << endl;

	if(j==n)//如果相等是插入排序 
	{
		cout << "Insertion Sort" << endl;
		sort(a,a+i+2,cmp);
	}

	else
	{
		cout << "Merge Sort" << endl;
		int k=1;
		int flag= 1;
		while(flag)
		{
			flag = 0;
			for(i=0;i<n;i++)
			{
				if(a[i]!=b[i])
				flag = 1;
			} 
			k = k*2;
		//	cout << k << endl << endl;
			for(i=0;i<n/k;i++)
			{
				//cout << i*k << " " << (i+1)*k <<"memeda" <<endl;
				sort(a+i*k,a+(i+1)*k,cmp);
			}
		
//			for(j=0;j<n;j++)
//			{
//			cout << a[j] << " ";
//			}
//			cout << endl;
		
			sort(a+n/k*k,a+n,cmp);
			//cout << n/k*k <<n <<endl;
			
		}
	}
	
	for(j=0;j<n-1;j++)
	{
		cout << a[j] << " ";
	}
	cout << a[n-1];
	delete [] a;
	delete [] b;
	return 0;
}	


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值