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