社区
C语言
帖子详情
双向链表的快速排序怎么写?
chary8088
2005-12-11 08:37:39
快速排序还比较熟悉,用双向链表就有点为难了?
...全文
871
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
打赏
举报
回复
根据存储格式不同使用不同的排序方式,既然是链表,在移动时只需要替换相应的指针就可以了。
源码分析J.U.C之ReentrantReadWriteLock底层原理
ReentrantReadWriteLock看这一篇就够了~~~
ReentrantReadWriteLock底层源码
文章目录1、ReentranReadWriteLock示例2、ReentrantReadWriteLock底层原理1、t1 w.lock,t2 r.lock1、
写
锁上锁流程1、acquire(arg)方法2、tryAcquire(arg)方法3、writerShouldBlock()方法2、读锁上锁流程1、acquireShared(arg)方法2、tryAcquireShared(arg)方法3、readerShouldBlock()方法4、doAcquireShared(arg)方法2、t3 r.lo
ReentrantReadWriteLock与ReentrantLock底层获取锁原理,关于AQS的差异分析
从源码可以看出,ReentrantLock是继承的Lock接口,而ReentrantReadWriteLock是实现了ReadWriteLock,我们再看下ReadWriteLock的源码:从源码中我们能得出结论,ReentrantLock、ReentrantReadWriteLock类底层都是Lock接口实现的从源码也能看出ReentrantLock、ReentrantReadWriteLock都具有内部静态类Sync实现AQS来实现获取锁等一系列操作,就不一一展示。
【Java源码阅读系列22】深度解读Java ReentrantReadWriteLock 源码
ReentrantReadWriteLock 是 Java java.util.concurrent.locks 包中的核心类,提供了读
写
分离锁功能,支持“多读单
写
”的并发模型(读锁共享、
写
锁独占),适用于读多
写
少的高并发场景。本文将结合 JDK 8 源码,从核心设计、关键方法、设计模式等角度深入解析其实现原理。
3步!ReentrantReadWriteLock源码全解析:读多
写
少场景提速10倍?
摘要: ReentrantReadWriteLock通过读
写
锁分离机制(高16位读锁计数/低16位
写
锁计数),显著优化读多
写
少场景。其核心规则为读读共享、读
写
互斥、
写
写
互斥,配合锁降级(
写
锁→读锁)可保证数据一致性。实战演示了高性能缓存系统实现,相比synchronized提升10倍读并发。进阶技巧包括公平/非公平锁选择、tryLock超时控制及lockInterruptibly中断响应,适用于不同业务场景。 关键词: 读
写
锁、锁降级、缓存优化、AQS、并发控制
C语言
70,040
社区成员
243,245
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章