PAT甲级1067 Sort with Swap(0, i) (25 分) 记录

题目
参考:PAT甲级1067 Sort with Swap(0, i):[C++题解]此题不是很懂!!


主要想梳理一下算法思路:

  • step1:以0为哨兵,就交换0和0所在位置本来应该放的那个数,直到0就位
  • step2:仅有step1,可能会存在0已就位,但数组仍存在部分元素未就位。于是从下标为1开始遍历(经过step1,0肯定已经就位),找到第一个未就位的位置下标,交换0和此位置上的元素,接着按照step1进行下去,知道0再次就位。
  • 终止条件:注意到step2中“找到第一个未就位的位置下标”,说明此位置之前的元素均就位(除了后面会“主动”让0不就位),而已就位的元素,在后面的交换中是不受影响的,所以经过step1、step2,已就位的部分是从位置1开始不断接续增长的,当再想找下一个未就位的位置下标发现已经超出数组范围时,终止。

代码:

#include<iostream>
using namespace std;

int main() {
	int n;
	cin >> n;
	int p[int(1e5+10)];
	int temp;
	for (int i = 0; i < n; i++) {
		cin >> temp;
		p[temp] = i; //注意这里,数组存的是位置
	}
	int res = 0;
	for (int i = 1; i < n;) {
		while (p[0]) {
			swap(p[0], p[p[0]]);
			res++;
		}
		while (i < n && p[i] == i)i++;
		//此时0已就位
		if(i < n) swap(p[0], p[i]), res++;
	}
	cout << res << endl;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值