1133 Splitting A Linked List (25分)/链表/sort

题目描述

在这里插入图片描述在这里插入图片描述

分析

思路

为不同的类型设立flag,最后根据flag对结构体排序。

易错点

如果对STL sort函数的原理不是很了解,可能会犯一个错误:
sort函数是一种混合式排序函数,数据量较小时使用插排,插排在当原始序列为同一个flag时,不会改变其顺序,但是当数据量较大时,使用快排和堆排,同一个flag的顺序可能被改变。因此,还需要设置一个变量存储结点出现的顺序。

#include<iostream>
#include<cstring>
#include<string>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
struct node {
	int add, val, next, flag, id;
}no[100000];
vector<node> v;
bool cmp(node a, node b) {
	return a.flag!=b.flag?a.flag < b.flag:a.id<b.id;
}
int main() {
#ifdef ONLINE_JUDGE
#else
	freopen("1.txt", "r", stdin);
#endif
	int head, n, k;
	cin >> head >> n >> k;
	while(n--){
		int i; cin >> i;
		no[i].add = i;
		scanf("%d%d", &no[i].val, &no[i].next);
		if (no[i].val < 0) no[i].flag = 1;
		else if (no[i].val <= k) no[i].flag = 2;
		else no[i].flag = 3;
	}
	int cnt = 0;
	for (int cur = head; cur != -1; cur = no[cur].next) {
		no[cur].id = cnt++;  //记录次序
		v.push_back(no[cur]);
	}
	sort(v.begin(), v.end(), cmp);
	for (int i = 0; i < v.size(); i++) {
		printf("%05d %d ", v[i].add, v[i].val);
		if (i != v.size() - 1) printf("%05d\n", v[i + 1].add);
		else printf("-1\n");
	}
	return 0;
}
发布了103 篇原创文章 · 获赞 9 · 访问量 4710

猜你喜欢

转载自blog.csdn.net/weixin_43590232/article/details/104358050