双向链表的快速排序怎么写?

chary8088 2005-12-11 08:37:39
快速排序还比较熟悉,用双向链表就有点为难了?
...全文
805 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
dot99 2005-12-12
  • 打赏
  • 举报
回复
partial_sort + linked-list RandomAccessIterator adpator + merge
被C++宠坏了的孩子们....

不过,感觉快速排序对链表这个容器好像不太适合~~浪费时间。。。

不如插入排序~~~

原因:
qsort通常要求的是RandomAccessIterator,而双向链表却是BidirectAccessIterator
所以这里为难了。。。
  • 打赏
  • 举报
回复
链表的快排写起来比数组的还简单些,std::list::sort 就是, 照抄下顺便就改成 C 的了.
cunsh 2005-12-11
  • 打赏
  • 举报
回复
这个是只交换节点的值的.
cunsh 2005-12-11
  • 打赏
  • 举报
回复

///////////////////////////////////////////////////////////////////////////
//DrawLines.cpp
#include <iostream>
#include <ctime>
using namespace std;

struct listnode{ //双向链表节点
listnode * up; //指向上个节点
listnode * down; //指向下个节点
int x; //值
};


class list{ //链表类
public:
listnode* kaishi; //链表头(该节点不算)
listnode* jieshu; //链表尾巴

list(){ //初始化空链表为一个表头节点
kaishi = jieshu = new listnode;
kaishi->up = kaishi->down = NULL;
}

void push_back(int x){ //在链表最后插入新节点,节点值为x
listnode* p = new listnode;
p->up = jieshu;
p->x = x;
jieshu->down = p;
jieshu = p;
jieshu -> down = NULL;
}

void print(){ //从头开始打印所有节点
listnode *p = kaishi->down; //kaishi所指的不算.从下一个开始
while(p != NULL){
cout << p->x << " -> " ;
p = p->down;
}
}

//析构...

};

//找出中间节点.用此节点将链表分为2部分
listnode* fenqu(listnode* zuo, listnode* you) ;

//排序的函数
void kuaipaixu(listnode * zuo, listnode* you)
{
if(zuo != you){ //如果只有一个节点了,返回,
listnode* zhong = fenqu(zuo, you); //如果有1个以上,则分成左右两部分
kuaipaixu(zuo,zhong->up); //分别对左右的部分调用排序主函数
kuaipaixu(zhong , you);
}
}

listnode* fenqu(listnode* zuo, listnode* you) //用返回的节点指针将链表分为2部分
{
listnode* re = zuo; //返回的分界线节点的指针.
int fenquzhi = (zuo->x + you->x) / 2; //分区的基准值
for(listnode* i = zuo; i!=you->down; i=i->down){ //遍历整个链表,将小于基准值的放re左边
if((i->x < fenquzhi)){
if(re!=i) swap(re->x , i->x);
re = re ->down;
}
}
return re;
}



int main()
{
list l;

srand((unsigned)time(NULL));

for(int i=0; i<10; i++) //向 l 插入10个节点
l.push_back(rand());

cout << "排序前的链表:" << endl;
l.print();

cout << endl;

kuaipaixu(l.kaishi->down, l.jieshu); //排序
cout << "排序后的:" << endl;
l.print(); //输出

cout << endl;

return 0;
}
chary8088 2005-12-11
  • 打赏
  • 举报
回复
思想都知道点吧,可是代码实现就有点麻烦了啊
那位给个
jjq5200311 2005-12-11
  • 打赏
  • 举报
回复
交换节点数据应该比较简单吧..跟数组差不多
oyljerry 2005-12-11
  • 打赏
  • 举报
回复
交换数据呢
cunsh 2005-12-11
  • 打赏
  • 举报
回复
快速排序里有个交换的swap函数.
如果swap里交换节点的值还好作.如果象1楼说的替换相应的指针更麻烦呀.
交换指针时.被交换的节点的前后的节点都要改变指针.

这个双向的链表我觉得要交换节点的值还不一定比用其他的排序快.
cunsh 2005-12-11
  • 打赏
  • 举报
回复
看起来比数组的麻烦.
chary8088 2005-12-11
  • 打赏
  • 举报
回复
up
RainWindy 2005-12-11
  • 打赏
  • 举报
回复
根据存储格式不同使用不同的排序方式,既然是链表,在移动时只需要替换相应的指针就可以了。

69,369

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧