链表的快速排序问题
Posted 碎片化学编程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表的快速排序问题相关的知识,希望对你有一定的参考价值。
今天想起链表的排序问题。下意识想到快排。仔细想了一下对数组的快排方法,觉得可以做一个双链表进行链表的快速排序。
附代码:
#include <iostream>
#include <fstream>
#include <string>
#include <ctime>
using namespace std;
//保存链表节点的类
class Node
{
public:
int id; //编号
Node *next; //保持下一个节点
Node *prev;
//默认构造函数
Node() : id(0), next(nullptr), prev(nullptr)
{ }
};
class List
{
Node *head;
Node *end;
int getnum(Node *p)
{
int i = 0;
Node *t = head;
while(t != nullptr)
{
if(p == t)
return i;
++i;
t = t->next;
}
return -1;
}
public:
List() : head(nullptr), end(nullptr)
{ }
void Add(int id);
Node* getHead() {return head; }
Node* getEnd() {return end; }
void display() const
{
Node *p = head;
while(p)
{
cout << p->id << endl;
p = p->next;
}
}
void sort(Node *low, Node *high);
};
void List::Add(int id)
{
Node *temp = new Node;
temp->id = id;
temp->prev = nullptr;
temp->next = nullptr;
if(head == nullptr)
{
head = end = temp;
}
else
{
end->next = temp;
temp->prev = end;
end = temp;
}
}
void List::sort(Node *low, Node *high)
{
if(!low || !high || getnum(low) >= getnum(high))
return ;
Node *i = low, *j = high;
int key = i->id;
while(i != j)
{
while(j != i && j->id >= key)
j = j->prev;
i->id = j->id;
while(i != j && i->id <= key)
i = i->next;
j->id = i->id;
}
i->id = key;
sort(low, i->prev);
sort(i->next, high);
}
int main()
{
List list;
srand((unsigned int)time(0));
for(int i = 0; i != 10000; ++i)
list.Add(rand() % 100000);
clock_t t1 = clock();
list.sort(list.getHead(), list.getEnd());
cout << clock() - t1 << endl;
cout << "排序完成" << endl;
return 0;
}
运行结果
以上是关于链表的快速排序问题的主要内容,如果未能解决你的问题,请参考以下文章