Ruby實現的各種排序演算法

來源:互聯網
上載者:User

Ruby實現的各種排序演算法

   這篇文章主要介紹了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]

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.