关于快速排序的改进算法

xinustc 2008-11-21 05:12:06
经典的快速排序算法是:
QuickSort(A,p,r)
if p<r
then q<-Partition(A,p,r)
QuickSort(A,p,q)
QuickSort(A,q+1,r)


改进的算法:(转自某算法书的思考题)

模拟尾递归

QuickSort(A,p,r)
while p<r
do q<-Partition(A,p,r)
QuickSort(A,p,q)
p<-q+1


请达人结合这两个算法说下尾递归和顺序递归的区别,我会在后面加分的,谢谢!
...全文
539 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
chen_de_sheng 2008-11-21
  • 打赏
  • 举报
回复
汗 是每次循环多一个
OhFish 2008-11-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 chen_de_sheng 的回复:]
尾递归多了一个函数调用,时间上来说没什么,
空间方面由于调用函数之前需要内存保存寄存器的内容,所以有更大的损耗
一般来说编译器都会帮我们的消除尾递归的
[/Quote]

岂止多了一次函数调用!!

经典的快速排序算法是:
QuickSort(A,p,r)
if p <r
then q <-Partition(A,p,r)
QuickSort(A,p,q)
QuickSort(A,q+1,r)//只要此时q+1 >=r 那么这个调用都是无意义。而q+1>=r的情况出 现岂止一次!.

模拟尾递归

QuickSort(A,p,r)
while p <r
do q <-Partition(A,p,r)
QuickSort(A,p,q)
p <-q+1 //这里就没有无意义的函数调用开销。


你看的是算法导论吗?
program2050 2008-11-21
  • 打赏
  • 举报
回复
强[Quote=引用 2 楼 ztz0223 的回复:]
给你一个更加猛的快排呵呵
我见过的最好的了我觉得:

C/C++ codevoid quicksort(int l, int u)
{
int i, m;
if (l >= u) return;
swap(l, randint(l, u));
m = l;
for (i = l+1; i <= u; i++)
if (x[i] < x[l])
swap(++m, i);
swap(l, m);
quicksort(l, m-1);
quicksort(m+1, u);
}
[/Quote]
chen_de_sheng 2008-11-21
  • 打赏
  • 举报
回复
尾递归多了一个函数调用,时间上来说没什么,
空间方面由于调用函数之前需要内存保存寄存器的内容,所以有更大的损耗
一般来说编译器都会帮我们的消除尾递归的
就呆在云上 2008-11-21
  • 打赏
  • 举报
回复
给你一个更加猛的快排呵呵
我见过的最好的了我觉得:
void quicksort(int l, int u)
{
int i, m;
if (l >= u) return;
swap(l, randint(l, u));
m = l;
for (i = l+1; i <= u; i++)
if (x[i] < x[l])
swap(++m, i);
swap(l, m);
quicksort(l, m-1);
quicksort(m+1, u);
}
deerwin1986 2008-11-21
  • 打赏
  • 举报
回复
是说选轴值的问题吗?
那样的话貌似没有区别...

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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