首页 > 代码库 > PAT甲题题解1098. Insertion or Heap Sort (25)-(插入排序和堆排序)
PAT甲题题解1098. Insertion or Heap Sort (25)-(插入排序和堆排序)
题目就是给两个序列,第一个是排序前的,第二个是排序中的,判断它是采用插入排序还是堆排序,并且输出下一次操作后的序列。
插入排序的特点就是,前面是从小到大排列的,后面就与原序列相同。
堆排序的特点就是,后面是从小到大排列的最大的几个数p~n-1,前面第一位则是p-1。
所以只要先按照插入排序的特点来判断是否为插入排序,接下来再进行操作就可以了,这里要手动写下最大堆的更新操作。
代码:
#include <iostream> #include <cstdio> #include <algorithm> #include <string.h> /* 之前一直WA的原因是,用for循环写寻找idx一开始就写错了。。。 找了整个序列的<,应该是找反例>从而跳出for循环,或者直接加到条件里。 比如: 一开始这么写, for(int i=0;i<n;i++){ if(num2[i]<=num2[i+1]) idx++; } 正确应该是: for(idx=0;idx<n-1 && num2[idx]<=num2[idx+1];idx++); 晕死。。。脑子糊涂了 */ using namespace std; const int maxn=105; int heap[maxn]; int heap_size=0; void swaps(int &a,int &b){ int tmp; tmp=a; a=b; b=tmp; } void heap_update(int i){ int bigger=i; int l=(i<<1)+1; int r=(i<<1)+2; if(l<heap_size && heap[l]>heap[i]) bigger=l; if(r<heap_size && heap[r]>heap[bigger]) bigger=r; if(bigger!=i){ swaps(heap[i],heap[bigger]); heap_update(bigger); } } void heap_pop(){ if(heap_size>=1){ swaps(heap[0],heap[heap_size-1]); //take the max to the rear. heap_size--; heap_update(0); } } int main() { int n; int num[maxn],num2[maxn]; scanf("%d",&n); for(int i=0;i<n;i++){ scanf("%d",&num[i]); } for(int i=0;i<n;i++){ scanf("%d",&num2[i]); } int idx; for(idx=0;idx<n-1 && num2[idx]<=num2[idx+1];idx++); int p=idx+1; for(;p<n && num[p]==num2[p];p++); if(p==n){ sort(num2,num2+idx+2); //相当于将num[idx+1]插入到前面排序 printf("Insertion Sort\n"); for(int i=0;i<n-1;i++) printf("%d ",num2[i]); printf("%d",num2[n-1]); } else{ int sortedsize=0; int tmpnum[maxn]; for(int i=0;i<n;i++) tmpnum[i]=num[i]; sort(tmpnum,tmpnum+n); p=n-1; /* 看了别人网上有写第三行AC的, 但按道理来说,如果序列是6450123789,那明显第三行就不对额。 */ for(;p>=0 && num2[p]==tmpnum[p];p--); //for(;p>=1 && num2[p]>=num2[0];p--); //for(;p>=1 && num2[p]>=num2[p-1];p--); 个人认为应该是过不了的。。。但却AC了 heap_size=p+1; for(int i=0;i<n;i++) heap[i]=num2[i]; heap_pop(); printf("Heap Sort\n"); for(int i=0;i<n-1;i++){ printf("%d ",heap[i]); } printf("%d",heap[n-1]); } return 0; }
PAT甲题题解1098. Insertion or Heap Sort (25)-(插入排序和堆排序)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。