置换选择排序

来源:互联网 发布:ubuntu 制作deb安装包 编辑:程序博客网 时间:2024/06/05 11:03

置换选择排序

描述


给定初始整数顺串,以及大小固定并且初始元素已知的二叉最小堆(为完全二叉树或类似完全二叉树,且父元素键值总小于等于任何一个子结点的键值),要求利用堆实现置换选择排序,并输出第一个顺串。例如给定初始顺串29,14,35,13,以及堆(记为16 19 31 25 21 56 40), 置换选择排序得到的第一个顺串为16 19 21 25。

输入
第一行包含两个整数,m为初始顺串的数的个数,n为二叉最小堆的大小
第二行包含m个整数,即初始顺串
第三行包含n个整数,即已经建好的堆的元素(有序,按照从堆顶到堆底,从左到右的顺序)
输出
输出包含一行,即第一个顺串。
样例输入
4 729 14 35 1316 19 31 25 21 56 40
样例输出

16 19 21 25
参考代码:

#include <stdio.h>#include<iostream> using namespace std;int m,size;int str[1001];int A[1001];class MinHeap { // 最小堆ADT定义public:int * heapArray; // 存放堆数据的数组 int CurrentSize; // 当前堆中元素数目 int MaxSize; // 堆所能容纳的最大元素数目 void BuildHeap(); // 建堆 MinHeap(int* array,const int n); // 构造函数,n为最大元素数目 void SiftDown(int left); // 筛选法};void MinHeap::SiftDown(int position) {int i=position; //标识父结点int j=2*i+1; //标识关键值较小的子结点int  temp=heapArray[i]; //保存父结点while (j<CurrentSize){ //过筛 if ((j<CurrentSize-1)&&(heapArray[j]>heapArray[j+1])) j++; //j指向数值较小的子结点 if (temp>heapArray[j]){ heapArray[i]=heapArray[j]; i=j; j=2*j+1; //向下继续 } else break;}heapArray[i]=temp;}void MinHeap::BuildHeap() {for (int i=CurrentSize/2-1; i>=0; i--) //反复调用筛选函数SiftDown(i);} MinHeap::MinHeap(int *array,const int n) {CurrentSize=n;MaxSize=n; //初始化堆容量为nheapArray=new int [MaxSize]; //创建堆空间for(int i=0;i<n;i++){heapArray[i] = array[i];}BuildHeap(); //此处进行堆元素的赋值工作}void replacementSelection(int *A){//建立最小值堆MinHeap H(A,size);int last = size-1;int len = m<last? m:size;for(int i=0; i<len; i++){cout<<H.heapArray[0]<<" ";  //堆的最小值if(str[i]>=H.heapArray[0]) H.heapArray[0] = str[i];else  {//否则用last位置记录代替根结点,把r放到lastH.heapArray[0] = H.heapArray[last];H.heapArray[last] = str[i];H.CurrentSize--;last--;}     if (last!=0) H.SiftDown(0);  //堆调整   }}int main(){cin>>m>>size;int i;for(i=0;i<m;i++){cin>>str[i];}for(i=0;i<size;i++)cin>>A[i];replacementSelection(A);return 0;}

0 0
原创粉丝点击