新手问题 用 ruby 做一个快速排序 (急)

zsc433 · 2013年07月05日 · 最后由 luikore 回复于 2013年07月05日 · 5299 次阅读

快速排序的思想:

一列无序的数字,随机挑选一个作为标杆,根据标杆,把数列整理成两部分,左边小于等于,右边大于标杆

然后分别对这两个小数列应用同样的“挑选标杆,分成两部分”,直到每个小数列只有最多一个元素,那么整个数列有序。

要求:

只能使用一个变量来作为额外的空间,不能另建数组。

比较着急,希望大神帮帮忙。

楼主回复可见答案

2 楼 已删除

#1 楼 @quakewang 这个思路不错..收藏下

回复楼下可见答案

回复可见

感觉不可能啊,函数调用不要空间啊

是公司给你的面试题目嘛?

回复可见答案

这是我的答案

回复可见答案

def quicksort(list)
  return list if list.size <= 1
  pivot = list.sample
  left, right = list.partition { |e| e < pivot }
  quicksort(left) + quicksort(right)
end

Ruby 实现排序算法

#11 楼 @Zernel

只能使用一个变量来作为额外的空间,不能另建数组。

#9 楼 是的,嘿嘿,刚开始学 ruby,所以对我来说有难度。

#10 楼 @reducm 怎么都是回复可见呀

我刚注册的,怎么回复了 还是看不见 @reducm,求指导

楼上一群坏人。

@jjzxcc 明白了,嘿嘿

#11 楼 @Zernel ruby 真是什么 api 都有啊,居然还有 partition~ 让我等 javaer 情何以堪啊,修炼一门语言语法和 SDK 真是同样重要。

我想看答案

可是没有看见呀

我在想你用一个数组呀,把所有的数字给当成是下标,然后就已经排好序了

真的回复可见?

#22 楼 @Teddy 回复也看不见

def f(a)
  (x=a.pop)? f(a.select{|i| i <= x}) + [x] + f(a.select{|i| i > x}) : []
end
匿名 #25 2013年07月05日

#11 楼 @Zernel 你不觉得这个 bug 很大么?试试{1,1,1,1,1,1}

只有写 C 代码时,针对元素数目不多的特定数组实现插入排序,才会比标准库的快排快一些,其他语言写排序都没意义。

尽管如此,按照楼主要求,使用一个变量作为额外的空间,对数组进行快速排序的 ruby 代码如下

一个变量 = nil
数组.sort!

楼上恶意卖萌,大棒轰粗

#26 楼 @luikore 其实更多的是考量对算法的熟悉程度…

#27 楼 @blacktulip 答案符合要求,而且速度还比其他实现快,经 源码考证 的确是用了 qsort() 的快速排序,有什么问题...

#30 楼 @luikore 问题就是…… 源码里面用了不止一个中间变量吧

#31 楼 @blacktulip 那是 C 里用的,而且编译器会优化掉一些我们不用管,要求是用 Ruby 实现...

#29 楼 @kungs 那这么拐弯抹角干嘛,直接问熟不熟就好了啊...

需要 登录 后方可回复, 如果你还没有账号请 注册新账号