这是前几天hottey面试的一个题目:不借助外部数组,只对链表本身进行操作来完成排序。我觉得甚有意思,便实现了一个。程序代码如下:
#include <iostream>
using namespace std;
template <typename T>
struct node // 节点结构
{
node *next;
T data;
};
template <typename T>
class slist // 单链表结构
{
public:
slist()
{
head.next = NULL;
}
~slist()
{
clear();
}
void clear() // 清空链表
{
node<T> *p;
while (head.next != NULL)
{
p = head.next;
head.next = p->next;
delete p;
}
}
void push_back(T t) // 为简化程序,只提供push_back接口完成元素插入
{
node<T> *p = &head;
while (p->next != NULL)
p = p->next;
node<T> *q = new node<T>;
q->data = t;
q->next = NULL;
p->next = q;
}
void print() // 为简化程序,不提供对operator<<的重载,直接使用成员函数输出
{
node<T> *p;
for (p = head.next; p != NULL; p = p->next)
cout << p->data;
}
void qksort(node<T> *begin, node<T> *end) // 快排
{
if (begin == end) // 递归退出条件
return;
T t;
node<T> *p, *q;
t = begin->data;
q = begin; // q作为哨兵指针
for (p = begin->next; p != end; p = p->next) // 一次快排
{
if (t > p->data)
{
q->data = p->data;
p->data = t;
q = p;
}
}
qksort(begin, q); // 哨兵前的快排
qksort(q->next, end); // 哨兵后的快排
}
void sort() // 调用快排完成排序
{
qksort(head.next, NULL);
}
private:
node<T> head;
};
int main()
{
slist<int> l;
for (int i = 5; i >= 0; i--)
l.push_back(i);
l.print();
cout << endl;
l.sort();
l.print();
return 0;
}
后记:由此亦能看出STL中为list单列一个sort算法的缘由。
分享到:
相关推荐
单链表排序
单链表排序和多项式分解
北邮 数据结构 实验一 单链表创建 排序 含代码
单链表排序,是C语言版的,供初学者参考,有问题请留言。
一种简单的单链表排序算法,建立在选择法的基础上。
Q1045564.zip 问题回答的代码 关于单链表排序插入 https://ask.csdn.net/questions/1045564
单链表交换节点排序,包括选择法、比较法、排序法。
用C语言编写的有关,两个单链表的归并排序操作.
编写程序完成单链表的创建、插入、删除、排序、并、交、差运算、及输出等基本操作。
以单链表为存储结构实现简单选择排序的算法
判断算法1和算法5生成单链表所表示的集合是否相等。 (10).在主函数中设计一个简单的菜单,分别调试上述算法。 【选作内容】 (11).利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。 (12).采用...
by Koma http://blog.csdn.net/wangningyu/archive/2010/09/19/5893595.aspx
构造两个带有表头结点的有序单链表La、Lb,编写程序实现将La、Lb合并成一个有序单链表Lc。 合并思想是:程序需要3个指针:pa、pb、pc,其中pa,pb分别指向La表与Lb表中当前待比较插入的结点,pc 指向Lc表中当前最后...
单链表的冒泡排序,热烈欢迎大家的下载,谢谢谢谢
链表的排序,c\c++源代码,自己想了想,有时这样是有需要的,虽然很麻烦
单链表实现从小到大排序,包括节点类,单链表类以及主函数!
C++单链表选择排序, 这个程序我已经不记得是不是我自己写的了,呵呵,放上来供初学者参考.