您的位置:首页 > 其它

单链表快速排序

2016-09-04 16:38 183 查看

详细解释在代码中,主要思路是将链表分为三个部分,小于key的链表,等于key的链表,大于key的链表

#include <iostream>
#include<string>
#include <vector>
#include <algorithm>
using namespace std;

class node
{
public:
int value;
node *next;
node():value(0),next(NULL)
{
}
node(int val):value(val),next(NULL)
{
}
};

void LinkQuickSort(node*&head)
{
if (NULL == head->next )
{
return;
}
const int key = head->value;
//将链表拆分为三部分
node *left = new node;//小于key的链表伪头结点
node *right = new node;//大于key的链表伪头结点
node *middle = head;//等于key的链表头结点

node *lastLeft,*lastRight,*temp,*lastMiddle;
lastRight = right;//记录链表最后一个节点
lastLeft = left;
lastMiddle = middle;

temp=head->next;//从第二个元素开始
lastMiddle->next = NULL;
while(NULL != temp)
{
if((temp->value)> key)
{
lastRight->next = temp;
lastRight = lastRight->next;
temp = temp->next;
lastRight->next=NULL;
}
else if ((temp->value) < key)
{
lastLeft->next = temp;
lastLeft = lastLeft->next;
temp = temp->next;
lastLeft->next=NULL;
}
else
{
lastMiddle->next = temp;
lastMiddle = lastMiddle->next;
temp = temp->next;
lastMiddle->next=NULL;
}
}
temp = left;
left = left->next;
temp->next = NULL;
delete temp;//删除伪头结点

temp = right;
right = right->next;
temp->next = NULL;
delete temp;

if(NULL != left)
LinkQuickSort(left);
if (NULL != right)
LinkQuickSort(right);

//合并三个链表

if (NULL != left)//做链表不为空
{
temp = left;
head = left;
while(temp->next!=NULL)//定位最后一个节点
{
temp = temp->next;
}
temp->next = middle;
}
else
{
head = middle;
}

lastMiddle->next = right;//right 为NULL也无所谓

}

int main()
{
node *head=new node;

node *temp = head;
temp->next = new node(5);
temp = temp->next;
temp->next = new node(19);
temp = temp->next;

temp->next = new node(19);
temp = temp->next;

temp->next = new node(22);
temp = temp->next;

temp->next = new node(44);
temp = temp->next;

temp = head;
head = head->next;
temp->next = NULL;
delete temp;

LinkQuickSort(head);

temp = head;
while(temp!=NULL)
{
cout << temp->value <<" ";
temp = temp->next;
}
cout << endl;

return 0;
}

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: