1098. Insertion or Heap Sort (25) 、 1089. Insert or Merge (25)

本文解析了PAT A组两道排序题:InsertorMerge与InsertionorHeapSort。提供了详细的AC代码示例,包括插入排序、归并排序及堆排序的实现方式,并通过比较原始数组与目标数组来判断是否可以通过特定的排序方法达到目标状态。

1089. Insert or Merge (25)

题目地址

https://www.patest.cn/contests/pat-a-practise/1089

ac代码

#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
#include <list>
#include <stack> 
#include <map> 
#include <set> 
#include <iterator> 
#include <unordered_map>

using namespace std;

#define INF 0x7fffffff

typedef long long int LL;

const int N = 105;

int n;

int a[N];
int a2[N];
int b[N];

bool isOK1()
{
	for(int i=0;i< n;i++)
	{
		if(a[i] != b[i])
			return false;
	}
	return true;
}

bool InsertionSort()  
{  
    int i ;  
    for(i = 2 ; i <= n ; i++)  
    {  
        sort(a , a+i);  
        if(isOK1())  
        {  
            if(i < n)  
            {  
                sort(a , a+i+1 ) ;  
            }  
            printf("Insertion Sort\n");  
            printf("%d" , a[0]) ;  
            for(int j = 1 ; j < n ; j ++)  
            {  
                printf(" %d" , a[j] );  
            }  
            printf("\n") ;  
            return true ;  
        }  
    }  
    return false ;  
}  

bool isOK2()
{
	for(int i=0;i< n;i++)
	{
		if(a2[i] != b[i])
			return false;
	}
	return true;
}

void MergeSort()
{
	int flag = 0;

	int d = 2;
	while(d < n)
	{
		int t = n / d;
		for(int i=0;i<=t;i++)
		{
			int t1 = i * d;
			if(t1 >= n )
				continue;
			int t2 = (i + 1) * d;
			if(t2 >= n)
				t2 = n;

			sort(a2 + t1, a2 + t2);	
		}

		if(isOK2() && flag == 0)
		{
			flag = 1;
		}else if(flag == 1)
		{
			printf("Merge Sort\n");
			for(int i=0;i<n-1;i++)
				printf("%d ", a2[i]);
			printf("%d\n", a2[n-1]);
			return;
		}

		d *= 2;
	}
	
	sort(a2, a2 +n);
	printf("Merge Sort\n");
	for(int i=0;i<n-1;i++)
		printf("%d ", a2[i]);
	printf("%d\n", a2[n-1]);
	return;
}

int main( )
{	
	//freopen("in.txt", "r", stdin);
	while( scanf("%d", &n) != EOF)
	{
		for(int i=0;i<n;i++)
		{
			scanf("%d", &a[i]);
			a2[i] = a[i];
		}
		for(int i=0;i<n;i++)
		{
			scanf("%d", &b[i]);
		}

		if(!InsertionSort())
		{
			MergeSort();
		}
		//printf("\n");
	}
	return 0;
}

1098. Insertion or Heap Sort (25)

题目地址

https://www.patest.cn/contests/pat-a-practise/1098


ac代码

#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include <sstream>
using namespace std ;

#define INF 999999
#define N 110
int n , m ;

int a[N] ;
int b1[N] ;
int b2[N] ;

bool isOk1()
{
	int i ;
	for(i = 0 ; i < n ; i ++)
	{
		if(a[i] != b1[i])
			return false ;
	}
	return true ;
}

bool cmp(int x , int y)
{
	return x < y ;
}

bool Insertion_Sort()
{
	int i ;
	for(i = 2 ; i <= n ; i++)
	{
		sort(a , a+i ,cmp);
		if(isOk1())
		{
			if(i < n)
			{
				sort(a , a+i+1 , cmp) ;
			}
			printf("Insertion Sort\n");
			printf("%d" , a[0]) ;
			for(int j = 1 ; j < n ; j ++)
			{
				printf(" %d" , a[j] );
			}
			printf("\n") ;
			return true ;
		}
	}
	return false ;
}

void adjust(int i , int m)
{
	int tmpi = i ; 
	while(tmpi < m)
	{
		int nowData = b2[tmpi] ;
		int left = -1 , right = -1;;
		if(tmpi*2 <= m)
			left = b2[tmpi*2] ;
		if(tmpi*2 + 1 <= m)
			right = b2[tmpi*2 + 1] ;
		if(b2[tmpi] > left && b2[tmpi] > right)
			break;
		if(left >= right)
		{
			if(left > b2[tmpi])
			{
				b2[tmpi] = left ;
				b2[2*tmpi] = nowData ;
				tmpi = tmpi * 2 ;
			}
		}else{
			if(right > b2[tmpi])
			{
				b2[tmpi] = right ;
				b2[2*tmpi + 1] = nowData ;
				tmpi = tmpi * 2 + 1;
			}
		}
	}
}

void Heap_Sort(int m)
{
	int i ;
	for(i = m / 2 ; i >= 1 ; i --)
	{
		adjust(i,m);
	}
}

int main()
{
	//freopen("in.txt","r",stdin);
	int i ;
	while( scanf("%d" , &n) != EOF) 
	{
		for(i = 0 ; i < n ; i++)
		{
			scanf("%d" , &a[i]) ;
		}
		for(i = 0 ; i < n ; i++)
		{
			scanf("%d" , &b1[i]) ;
			b2[i+1] = b1[i] ;
		}
		if( !Insertion_Sort())
		{
			printf("Heap Sort\n");
			int pos = n ;
			while(b2[pos--] > b2[1]) ;
			pos++ ;
			int tmp = b2[1];
			b2[1] = b2[pos];
			b2[pos] = tmp ;

			int m = pos - 1 ;
			Heap_Sort(m);
			printf("%d" , b2[1]) ;
			for(int j = 2 ; j <= n ; j ++)
			{
				printf(" %d" , b2[j] );
			}
			printf("\n") ;
		}
	}
	return 0 ;
}

利用C++ STL中的heap 

heap用法参考

http://blog.youkuaiyun.com/blade2001/article/details/6901100


#include <cstdio>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <algorithm>
#include <sstream>
#include <list>
#include <stack> 
#include <map> 
#include <set> 
#include <iterator> 
#include <unordered_map>

using namespace std;

#define INF 0x7fffffff

typedef long long int LL;

#define N 110  
int n , m ;  
  
int a[N] ;  
int b1[N] ;  
int b2[N] ;  
  
bool isOk1()  
{  
    int i ;  
    for(i = 0 ; i < n ; i ++)  
    {  
        if(a[i] != b1[i])  
            return false ;  
    }  
    return true ;  
}  
  
bool cmp(int x , int y)  
{  
    return x < y ;  
}  
  
bool Insertion_Sort()  
{  
    int i ;  
    for(i = 2 ; i <= n ; i++)  
    {  
        sort(a , a+i ,cmp);  
        if(isOk1())  
        {  
            if(i < n)  
            {  
                sort(a , a+i+1 , cmp) ;  
            }  
            printf("Insertion Sort\n");  
            printf("%d" , a[0]) ;  
            for(int j = 1 ; j < n ; j ++)  
            {  
                printf(" %d" , a[j] );  
            }  
            printf("\n") ;  
            return true ;  
        }  
    }  
    return false ;  
} 

int main()  
{  
    //freopen("in.txt","r",stdin);  
    int i ;  
    while( scanf("%d" , &n) != EOF)   
    {  
        for(i = 0 ; i < n ; i++)  
        {  
            scanf("%d" , &a[i]) ;  
        }  
        for(i = 0 ; i < n ; i++)  
        {  
            scanf("%d" , &b1[i]) ;  
            b2[i+1] = b1[i] ;  
        }  
        if( !Insertion_Sort())  
        {  
            printf("Heap Sort\n");  
            int pos = n ;  
            while(b2[pos--] > b2[1]) ;  
				pos++ ;  
            int tmp = b2[1];  
            b2[1] = b2[pos];  
            b2[pos] = tmp ;  
  
            int m = pos - 1 ;  
           
	    vector<int> v;
	    for(int i=1;i<=m;i++)
		v.push_back(b2[i]);

	    make_heap(v.begin(), v.end());
	    for(vector<int>::iterator iter=v.begin();iter!=v.end();++iter)
		cout<<*iter<<" ";

            for(int j = m + 1; j < n ; j ++)  
            {  
                printf("%d " , b2[j] );  
            } 
			printf("%d", b2[n]);
            printf("\n") ;  
        }  
    }  
    return 0 ;  
}  




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值