【计算机考研408】置换选择排序 + 代码 PAT 甲级 1171 Replacement Selection

文章介绍了置换选择排序的流程,特别是如何在有限内存空间内进行排序,使用了优先队列(最小堆)来实现。通过一个PAT甲级编程题实例展示了如何应用该算法,解决在内存限制下进行序列排序的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

王道-置换选择排序b站教学视频

置换选择排序的流程

图片比文字更好理解,故不加文字解释
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当当前工作区已经满了并且找不到合适的放入当前归并段的元素的时候,开始生成下一个归并段。
此后重复上述过程。

计算机考研可能考察置换选择排序的知识点

  1. 归并段个数 = 总的记录个数 / 每个归并段的长度 【上取整】
  2. 利用败者树选择minimax
  3. 外部排序

PAT 甲级 1171 Replacement Selection 题解

题目

给你一个长度为n的序列,和一个大小为m的内存空间,每次排序的大小不能超过m这个内存空间,使用置换选择算法,输出一个或者多个有序的序列

题解

  • 知识点

置换选择排序

用于内部排序的内存工作区WA可容纳L个记录,则每个初始归并段也只能包含L个记录,若文件共有n个记录,则初始归并段的数量r=n/L

  • 解题思路
  1. 利用priority_queue实现最小堆
  2. 将小于minimax的数放到下一行去进行处理
#include <bits/stdc++.h>
using namespace std;

int main(){
    int n, m; cin >> n >> m;
	vector<int> arr(n);
    for(int i = 0; i < n; i++){ 
    	cin >> arr[i];
    }
    priority_queue<int, vector<int>, greater<int>> wa;
    
    vector<int> v, line; // v存放下轮的数,line存放本轮的数
    //int wasize = 0; //工作区当前空闲大小
    int minimax = INT_MIN;
    
    int index = 0;
    //将数先压入工作区
    for(; index < m; index++){
    	wa.push(arr[index]);
    }

    int count = 0;
    //用于统计是否处理完序列中的所有数字
    while(count < n){
    	//因为当前工作区是第一组进入工作区的序列,所以直接处理就可以了
    	minimax = wa.top();
    	line.push_back(minimax);
    	wa.pop();
    	count++;

    	if (index < n){
    		if (arr[index] > minimax) {
    			wa.push(arr[index++]);
    		}
    		else {
    			v.push_back(arr[index++]);
    		}
    	}
    	if (wa.empty()){
    		//工作区为空的情况下
    		//说明第一行已经处理完毕了
    		for(int i = 0; i < line.size(); i++){
    			if (i == 0) cout << line[i];
    			else cout << " " << line[i];
    		}
    		cout << '\n';
    		line.clear();
    		for(int i = 0; i < v.size(); i++){
    			wa.push(v[i]);
    		}
    		v.clear();
    	}
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值