IT评测·应用市场-qidao123.com技术社区

标题: OpenJudge | 置换选择排序 [打印本页]

作者: 科技颠覆者    时间: 2024-10-7 13:46
标题: OpenJudge | 置换选择排序
总时间限定: 1000ms 内存限定: 65536kB
形貌
给定初始整数顺串,以及大小固定而且初始元素已知的二叉最小堆(为完全二叉树或类似完全二叉树,且父元素键值总小于等于任何一个子结点的键值),要求使用堆实现置换选择排序,并输出第一个顺串。比方给定初始顺串29,14,35,13,以及堆(记为16 19 31 25 21 56 40), 置换选择排序得到的第一个顺串为16 19 21 25


输入

第一行包罗两个整数,m为初始顺串的数的个数,n为二叉最小堆的大小
第二行包罗m个整数,即初始顺串
第三行包罗n个整数,即已经建好的堆的元素(有序,按照从堆顶到堆底,从左到右的次序)
输出

输出包罗一行,即第一个顺串。
样例输入

  1. 4 7
  2. 29 14 35 13
  3. 16 19 31 25 21 56 40
复制代码
样例输出

  1. 16 19 21 25
复制代码
思路

看完原理,我们可以将代码分为两个部门,一个是调整堆的代码,一个是置换选择排序的代码。
代码剖析

先说调整堆的代码:
  1. void reflushHeap(int n) {
  2.     int i = 1;
  3.         while(2*i <= n || 2*i+1 <= n) {
  4.                 if(2*i <= n && 2*i+1 <= n) {
  5.                         if(ar[2*i] < ar[2*i+1]) {
  6.                                 if(ar[i] > ar[2*i]) {
  7.                                         swap(ar[i], ar[2*i]);
  8.                                         i = 2*i;
  9.                                 }
  10.                         } else {
  11.                                 if(ar[i] > ar[2*i+1]) {
  12.                                         swap(ar[i], ar[2*i+1]);
  13.                                         i = 2*i+1;
  14.                                 }
  15.                         }
  16.                 } else if(2*i <= n && 2*i+1 > n) {
  17.                         if(ar[i] > ar[2*i]) {
  18.                                 swap(ar[i], ar[2*i]);
  19.                                 i = 2*i;
  20.                         }       
  21.                 } else break;
  22.         }
  23. }
复制代码
然后是置换选择排序的代码:
这代码在排除输入部门之后是如许的:
  1. while(t--) {
  2.     if(n <= 0) break;
  3.     res.push_back(ar[1]);
  4.     if(res.back() > in[j]) {
  5.         ar[1] = in[j];
  6.         swap(ar[1], ar[n]);
  7.         --n;
  8.         reflushHeap(n);
  9.     } else {
  10.         ar[1] = in[j];
  11.         reflushHeap(n);
  12.     }
  13.     ++j;
  14. }
复制代码
Code

  1. #include <bits/stdc++.h>
  2. #pragma GCC optimize(3,"Ofast","inline")
  3. using namespace std;
  4. int ar[1024], in[1024];
  5. void reflushHeap(int n) {
  6.         int i = 1;
  7.         while(2*i <= n || 2*i+1 <= n) {
  8.                 if(2*i <= n && 2*i+1 <= n) {
  9.                         if(ar[2*i] < ar[2*i+1]) {
  10.                                 if(ar[i] > ar[2*i]) {
  11.                                         swap(ar[i], ar[2*i]);
  12.                                         i = 2*i;
  13.                                 }
  14.                         } else {
  15.                                 if(ar[i] > ar[2*i+1]) {
  16.                                         swap(ar[i], ar[2*i+1]);
  17.                                         i = 2*i+1;
  18.                                 }
  19.                         }
  20.                 } else if(2*i <= n && 2*i+1 > n) {
  21.                         if(ar[i] > ar[2*i]) {
  22.                                 swap(ar[i], ar[2*i]);
  23.                                 i = 2*i;
  24.                         }       
  25.                 } else break;
  26.         }
  27. }
  28. int main() {
  29.         vector<int> res;
  30.         ios::sync_with_stdio(false);
  31.         cin.tie(nullptr);
  32.         cout.tie(nullptr);
  33.         int m, n, t, j = 1;
  34.         cin >> m >> n;
  35.         res.reserve(m);
  36.         for(int i = 1; i <= m; ++i) {
  37.                 cin >> in[i];
  38.         }
  39.         for(int i = 1; i <= n; ++i) {
  40.                 cin >> ar[i];
  41.         }
  42.         t = m;
  43.         while(t--) {
  44.                 if(n <= 0) break;
  45.                 res.push_back(ar[1]);
  46.                 if(res.back() > in[j]) {
  47.                         ar[1] = in[j];
  48.                         swap(ar[1], ar[n]);
  49.                         --n;
  50.                         reflushHeap(n);
  51.                 } else {
  52.                         ar[1] = in[j];
  53.                         reflushHeap(n);
  54.                 }
  55.                 ++j;
  56.         }
  57.         for(auto i: res) {
  58.                 cout << i << " ";
  59.         }
  60. }
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4