Ruby实现的各种排序算法


时间复杂度:Θ(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实现生产者和消费者代码require'thread'queue=Queue.newconsumers=Thread.newdo5.timesdo|i|obj=queue.popprint"consumer:#{i}n"sleep(rand(0.05))endendproducters=Thread.newdo5.timesdo|i|sleep

Ruby中require、load、include、extend的区别介绍
require,load用于文件,如.rb等等结尾的文件。include,load则用于包含一个文件中的模块。require一般情况下用于加载库文件,而load则用于加载配置文件。1、re

Ruby中proc和lambda的两个区别
1、在proc和lambda中,return关键字有不同含义:在proc中,return仅仅表示从这个lambda中返回.在lambda中,return不是从proc中返回,而是从定义proc的作用域中返回.defone_m