社区
C语言
帖子详情
双向链表的快速排序怎么写?
chary8088
2005-12-11 08:37:39
快速排序还比较熟悉,用双向链表就有点为难了?
...全文
834
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个整数元素进行排序。
利用双向循环链表实现
快速排序
算法
利用了双向循环链表实现了
快速排序
算法
使用
双向链表
实现
快速排序
,C语言
使用
双向链表
实现
快速排序
,C语言,有详细注释
[第一部分]精选微软等公司数据结构+算法经典面试100题[1-40题]
此为我个人搜集整理的, 精选微软等公司,有关 数据结构和算法的面试100题[前40题], 此绝对值得你下载收藏。 网友yui评论,真是够多的了,从此,不用再看其它面试题.... 一句话,请享用。 其它资源,下载地址: 1.[最新答案V0.3版]微软等数据结构+算法面试100题[第21-40题答案] http://download.csdn.net/source/2832862 2.[第1题-60题汇总]微软等数据结构+算法面试100题 http://download.csdn.net/source/2826690 3.[答案V0.2版]精选微软数据结构+算法面试100题[前20题]--修正 http://download.csdn.net/source/2813890 //此份答案是针对最初的V0.1版本,进行的校正与修正。 4.[答案V0.1版]精选微软数据结构+算法面试100题[前25题] http://download.csdn.net/source/2796735 5.[第二部分]精选微软等公司结构+算法面试100题[前41-60题]: http://download.csdn.net/source/2811703 6.[第一部分]精选微软等公司数据结构+算法经典面试100题[1-40题] http://download.csdn.net/source/2778852 更多资源,下载地址: http://v_july_v.download.csdn.net/ //请继续期待,后续内容。 ------------------------------------------------------ 各位,若对以上100题任何一道,或对已上传的任何一题的答案, 有任何问题,请把你的思路、想法,回复到此帖子上, 微软等100题系列,永久维护地址(2010年11.26日): http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html -------July、2010年12月2日。
C语言
70,035
社区成员
243,244
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章