社区
C语言
帖子详情
双向链表的快速排序怎么写?
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
所以这里为难了。。。
DiabloWalkOnTheEarth
2005-12-12
打赏
举报
回复
链表的快排写起来比数组的还简单些,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
打赏
举报
回复
根据存储格式不同使用不同的排序方式,既然是链表,在移动时只需要替换相应的指针就可以了。
基于
双向链表
的
快速排序
c程序
用c编
写
的基于
双向链表
的
快速排序
。在DEVC++下和codeblock下编译通过。
在
双向链表
上实现
快速排序
的递归算法
在
双向链表
上实现
快速排序
的递归算法 输入的形式:元素个数、元素都为整型。 输入值范围:元素个数为非负正整数,需要排序的元素都为整型。 输出的形式:排序前的元素序列和排序后的元素序列。 程序的功能:对用户输入的n个整数元素进行排序。
从零手
写
JDK底层队列
手
写
JDK的单向
双向链表
的实现。链表属于java数据结构的一种。大公司面试的必问的。好记性不如烂笔头。自己手
写
一个链表的实现。一辈子都不会忘记所涉及知识点->单向链表->
双向链表
->JDK底层cas的使用->队列先进先出模式->队列先进后出模式->链表对象gc回收关注我。更多java底层实现只是分享
利用双向循环链表实现
快速排序
算法
利用了双向循环链表实现了
快速排序
算法
使用
双向链表
实现
快速排序
,C语言
使用
双向链表
实现
快速排序
,C语言,有详细注释
C语言
69,369
社区成员
243,082
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章