Ruby实现的各种排序算法

 更新时间:2015年05月22日 11:39:25   投稿:junjie  
这篇文章主要介绍了Ruby实现的各种排序算法,本文给出了Bubble sort、Insertion sort、Selection sort、Shell sort等排序的实现方法,需要的朋友可以参考下

时间复杂度:Θ(n^2)

Bubble sort

复制代码 代码如下:

def bubble_sort(a) 
  (a.size-2).downto(0) do |i| 
    (0..i).each do |j| 
      a[j], a[j+1] = a[j+1], a[j] if a[j] > a[j+1] 
    end 
  end 
  return a 
end

Selection sort

复制代码 代码如下:

def selection_sort(a) 
  b = [] 
  a.size.times do |i| 
    min = a.min 
    b << min 
    a.delete_at(a.index(min)) 
  end 
  return b 
end

Insertion sort

复制代码 代码如下:

def insertion_sort(a) 
  a.each_with_index do |el,i| 
    j = i - 1 
      while j >= 0 
        break if a[j] <= el 
        a[j + 1] = a[j] 
        j -= 1 
      end 
    a[j + 1] = el 
  end 
  return a 
end 

 Shell sort
 

复制代码 代码如下:

def shell_sort(a) 
  gap = a.size 
  while(gap > 1) 
    gap = gap / 2 
    (gap..a.size-1).each do |i| 
      j = i 
      while(j > 0) 
        a[j], a[j-gap] = a[j-gap], a[j] if a[j] <= a[j-gap] 
        j = j - gap 
      end 
    end 
  end 
  return a 
end

时间复杂度:Θ(n*logn)

Merge sort

复制代码 代码如下:

def merge(l, r) 
  result = [] 
  while l.size > 0 and r.size > 0 do 
    if l.first < r.first 
      result << l.shift 
    else 
      result << r.shift 
    end 
  end 
  if l.size > 0 
    result += l 
  end 
  if r.size > 0 
    result += r 
  end 
  return result 
end 
 
def merge_sort(a) 
  return a if a.size <= 1 
  middle = a.size / 2 
  left = merge_sort(a[0, middle]) 
  right = merge_sort(a[middle, a.size - middle]) 
  merge(left, right) 
end 

Heap sort

复制代码 代码如下:

def heapify(a, idx, size) 
  left_idx = 2 * idx + 1 
  right_idx = 2 * idx + 2 
  bigger_idx = idx 
  bigger_idx = left_idx if left_idx < size && a[left_idx] > a[idx] 
  bigger_idx = right_idx if right_idx < size && a[right_idx] > a[bigger_idx] 
  if bigger_idx != idx 
    a[idx], a[bigger_idx] = a[bigger_idx], a[idx] 
    heapify(a, bigger_idx, size) 
  end 
end 

def build_heap(a) 
  last_parent_idx = a.length / 2 - 1 
  i = last_parent_idx 
  while i >= 0 
    heapify(a, i, a.size) 
    i = i - 1 
  end 
end 
 
def heap_sort(a) 
  return a if a.size <= 1 
  size = a.size 
  build_heap(a) 
  while size > 0 
    a[0], a[size-1] = a[size-1], a[0] 
    size = size - 1 
    heapify(a, 0, size) 
  end 
  return a 
end 

Quick sort

复制代码 代码如下:

def quick_sort(a) 
  (x=a.pop) ? quick_sort(a.select{|i| i <= x}) + [x] + quick_sort(a.select{|i| i > x}) : [] 
end 

时间复杂度:Θ(n)

Counting sort

复制代码 代码如下:

def counting_sort(a) 
  min = a.min 
  max = a.max 
  counts = Array.new(max-min+1, 0) 
 
  a.each do |n| 
    counts[n-min] += 1 
  end 
 
  (0...counts.size).map{|i| [i+min]*counts[i]}.flatten 
end 

Radix sort

复制代码 代码如下:

def kth_digit(n, i) 
  while(i > 1) 
    n = n / 10 
    i = i - 1 
  end 
  n % 10 
end 
 
def radix_sort(a) 
  max = a.max 
  d = Math.log10(max).floor + 1 
 
  (1..d).each do |i| 
    tmp = [] 
    (0..9).each do |j| 
      tmp[j] = [] 
    end 
 
    a.each do |n| 
      kth = kth_digit(n, i) 
      tmp[kth] << n 
    end 
    a = tmp.flatten 
  end 
  return a 
end 

Bucket sort
复制代码 代码如下:

def quick_sort(a) 
  (x=a.pop) ? quick_sort(a.select{|i| i <= x}) + [x] + quick_sort(a.select{|i| i > x}) : [] 
end 
 
def first_number(n) 
  (n * 10).to_i 
end 
 
def bucket_sort(a) 
  tmp = [] 
  (0..9).each do |j| 
    tmp[j] = [] 
  end 
   
  a.each do |n| 
    k = first_number(n) 
    tmp[k] << n 
  end 
 
  (0..9).each do |j| 
    tmp[j] = quick_sort(tmp[j]) 
  end 
 
  tmp.flatten 
end 
 
a = [0.75, 0.13, 0, 0.44, 0.55, 0.01, 0.98, 0.1234567] 
p bucket_sort(a) 
 
# Result:  
[0, 0.01, 0.1234567, 0.13, 0.44, 0.55, 0.75, 0.98] 

相关文章

  • Ruby中变量引用时的一些注意点

    Ruby中变量引用时的一些注意点

    这篇文章主要介绍了Ruby中变量引用时的一些注意点,被当作变量或被当作方法调用的情况,需要的朋友可以参考下
    2015-07-07
  • 初步了解一下什么是ruby

    初步了解一下什么是ruby

    了解下什么是ruby,希望学习ruby的朋友了解下
    2008-06-06
  • ruby写扫描当前网页所有url的脚本

    ruby写扫描当前网页所有url的脚本

    用ruby写的扫描当前网页所有url的脚本,对于学习ruby的朋友是个不错的实例
    2008-06-06
  • 分析 rudy 类

    分析 rudy 类

    分析 rudy 类...
    2007-11-11
  • Ruby中proc和lambda的两个区别

    Ruby中proc和lambda的两个区别

    这篇文章主要介绍了Ruby中proc和lambda的两个区别,本文讲解了在proc和lambda中,return关键字有不同含义、检查参数的方式不同两个重要区别,需要的朋友可以参考下
    2015-05-05
  • Ruby中的String对象学习笔记

    Ruby中的String对象学习笔记

    这篇文章主要介绍了Ruby中的String对象学习笔记,本文讲解了String对象的定义、String对象的操作、使用数组下标的方式操作字符串等内容,需要的朋友可以参考下
    2014-11-11
  • Ruby实现网页图片抓取

    Ruby实现网页图片抓取

    本文给大家分享的是个人使用ruby编写的抓取网页图片的代码,十分的简单实用,有需要的小伙伴可以参考下。
    2016-04-04
  • Ruby on Rails实现最基本的用户注册和登录功能的教程

    Ruby on Rails实现最基本的用户注册和登录功能的教程

    这里我们主要以has_secure_password的用户密码验证功能为中心,来讲解Ruby on Rails实现最基本的用户注册和登录功能的教程,需要的朋友可以参考下
    2016-06-06
  • ruby执行周期性任务的三种gem介绍

    ruby执行周期性任务的三种gem介绍

    无论是用ruby做系统管理,还是用rails做web开发,都可能遇到周期性任务,它们按照一定时间周期(1小时,2天......)持续地触发。在ruby中,我认为一次性任务使用 sidekiq 来完成是非常方便的,而周期性的任务就需要用到 whenever , sidetiq , clockwork 等等gem了。
    2014-07-07
  • ruby中并发并行与全局锁详解

    ruby中并发并行与全局锁详解

    最近在学习ruby,想着将自己学习的内容总结一下分享出来,下面这篇文章主要给大家介绍了关于ruby中并发并行与全局锁的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴,下面来一起看看吧。
    2017-09-09

最新评论