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 ;
}