置换选择排序

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


  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值