链表的快速排序问题

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;


运行结果







以上是关于链表的快速排序问题的主要内容,如果未能解决你的问题,请参考以下文章

算法链表的快速排序和归并排序

算法链表的快速排序和归并排序

链表实现快速排序

单链表的快速排序(转)

如何在我的递归快速排序算法中防止堆栈溢出

链表快排 & 基于链表的排序