1:置换选择排序
-
总时间限制:
- 1000ms 内存限制:
- 65536kB
-
描述
-
给定初始整数顺串,以及大小固定并且初始元素已知的二叉最小堆(为完全二叉树或类似完全二叉树,且父元素键值总小于等于任何一个子结点的键值),要求利用堆实现置换选择排序,并输出第一个顺串。例如给定初始顺串29,14,35,13,以及堆(记为16 19 31 25 21 56 40), 置换选择排序得到的第一个顺串为16 19 21 25。
输入
-
第一行包含两个整数,m为初始顺串的数的个数,n为二叉最小堆的大小
第二行包含m个整数,即初始顺串
第三行包含n个整数,即已经建好的堆的元素(有序,按照从堆顶到堆底,从左到右的顺序)
输出
- 输出包含一行,即第一个顺串。 样例输入
-
4 7 29 14 35 13 16 19 31 25 21 56 40
样例输出
-
16 19 21 25
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> #include<iomanip> #include<queue> #include<stack> #include<vector> #include<set> #include<map> using namespace std; int Heap[1005]; int Heapsize,n; int In[1005]; void Shiftdown() { int t=0; while(true) { if(2*t+2<Heapsize) { if(Heap[2*t+1]<=Heap[2*t+2]) { swap(Heap[2*t+1],Heap[t]); t=2*t+1; } else { swap(Heap[2*t+2],Heap[t]); t=2*t+2; } } else if(2*t+1<Heapsize) { swap(Heap[t],Heap[2*t+1]); t=2*t+1; } else return; } } int main() { cin>>n>>Heapsize; for(int i=0;i<n;++i) { cin>>In[i]; } for(int i=0;i<Heapsize;++i) { cin>>Heap[i]; } for(int i=0;i<n;++i) { if(Heapsize>0) { int tmp=Heap[0]; cout<<tmp<<" "; if(In[i]>=tmp) { Heap[0]=In[i]; Shiftdown(); } else { Heap[0]=Heap[--Heapsize]; Shiftdown(); } } else break; } cout<<endl; return 0; }