STL链表归并排序

STL链表归并排序

stl链表归并思路
第一次见到这种思路来源于《stl源码剖析》一书。

#include <iostream>
#include<vector>
using namespace std;
struct Node {
	int i;
	Node* next;
	Node(int ii):i(ii),next(nullptr) {
	}
};
Node* merge(Node* l, Node* r) {
	Node* ret = new Node(0);
	Node* p = ret;
	while (l && r) {
		if (l->i > r->i) {
			p->next = l;
			l = l->next;
		}
		else {
			p->next = r;
			r = r->next;
		}
		p = p->next;
	}
	p->next = l == NULL ? r : l;
	return ret->next;
}
Node* Nsort(Node* head) {
	const int kMaxLength = 20;
	vector<Node*> step(kMaxLength);
	int E = 0;
	while (head) {
		step[0] = head;
		head = head->next;
		step[0]->next = NULL;
		for (int i = 0; i < kMaxLength; i++) {
			if (step[i+1] == NULL) {
				step[i+1] = step[i];
				step[i] = NULL;
				E = E > i + 1 ? E : i + 1;
				break;
			}
			else {
				step[i+1] = merge(step[i], step[i + 1]);
				step[i] = NULL;
			}
		}
	}
	for (int i = 0; i < E; i++) {
		step[i + 1] = merge(step[i], step[i + 1]);
	}
	return step[E];
}
int main() {
	int i;
	vector<int> N;
	Node* head = new Node(0);
	Node* p = head;

	while (cin >> i) {//window ctrl+z 结束控制台输入
		p->next = new Node(i);
		p = p->next;
	}

	head = Nsort(head->next);

	while (head) {
		cout << head->i << " ";
		head = head->next;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值