程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 更多編程語言 >> 更多關於編程 >> Ruby實現的各種排序算法

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]

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved