C++标准模板库STL链表类list实现表外排序

1.表外排序

对链表的排序可分为表内排序和表外排序,表内排序将改变链表内原来的排列顺序,而表外排序不改变原链表中的排列顺序,并且排序效率也较高,我们可以借助指针数组(迭代器数组)的方法实现表外排序,代码如下所示:

#include <list>
#include <iostream>
#include <random>
#include <time.h>
using namespace std;
typedef int DATA;
//定义全局链表
list<DATA> g_list;
typedef list<DATA>::iterator POSITION;
//数据输入函数
void Input()
{
	//随机生成20个10到100的整数,并尾插到链表中去
	srand((unsigned)time(NULL));
	int i = 20;
	while(i--)
		g_list.push_back(rand() % 91 + 10);
}
//打印排序前的结果函数
void PrintBeforeSort()
{
	cout << "排序前:" << endl;
	POSITION it = g_list.begin();
	while (it!=g_list.end())
	{
		cout << *it << " ";
		++it;
	}
	cout << endl;
}
//打印排序后的结果函数
void PrintAfterSort(POSITION *ps)
{
	cout << "排序后:" << endl;
	int i = 0;
	while (ps[i]!=g_list.end())
		cout << *ps[i++] << " ";
	cout << endl;
}
//表外排序函数
POSITION *Sort()
{
	//求出链表个数
	int n = g_list.size();
	//在堆上申请n+1个迭代器数组,第n+1放尾迭代器
	POSITION *ps = new POSITION[n + 1];
	//求出首节点的迭代器
	POSITION it = g_list.begin();
	//循环将指向链表中每个节点的迭代器放入申请好的迭代器数组中
	int i = 0;
	while ((ps[i] = it) != g_list.end())
		++it, ++i;
	//使用选择排序在堆上申请的迭代器数组中进行数据的表外排序
	i = 0;
	while (i<n)
	{
		int j = i + 1;
		int m = i;
		while (j<n)
		{
			if (*ps[j] < *ps[m])
				m = j;
			++j;
		}
		if (m != i)
		{
			POSITION tmp = ps[m];
			ps[m] = ps[i];
			ps[i] = tmp;
		}
		++i;
	}
	return ps;
}
int main()
{
	Input();
	//打印排序前的结果
	PrintBeforeSort();
	//表外排序
	POSITION* ps = Sort();
	//打印排序后的结果
	PrintAfterSort(ps);
	//释放堆上申请的空间
	delete[]ps;
	/*
	表外排序并未改变原链表中的数据顺序
	我们可以再次打印链表中的数据,结果和排序前相同
	*/
	PrintBeforeSort();
	getchar();
	return 0;
}

输出结果:

排序前:
46 11 66 94 13 44 62 90 74 70 33 34 47 98 70 80 18 80 49 41
排序后:
11 13 18 33 34 41 44 46 47 49 62 66 70 70 74 80 80 90 94 98
排序前:
46 11 66 94 13 44 62 90 74 70 33 34 47 98 70 80 18 80 49 41

发布了21 篇原创文章 · 获赞 20 · 访问量 2977

猜你喜欢

转载自blog.csdn.net/weixin_42844163/article/details/104125901