现在的位置: 首页 > 综合 > 正文

单链表的排序

2013年11月08日 ⁄ 综合 ⁄ 共 1130字 ⁄ 字号 评论关闭

 #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;
}

抱歉!评论已关闭.