经典排序算法资料及 ruby 实现
来源:互联网 发布:生物医学数据挖掘 pdf 编辑:程序博客网 时间:2024/04/28 15:33
经典排序算法资料及ruby实现
学习<算法导论>时到网络上找了一批排序算法的资料. 结合参考资料分别用ruby写了一遍. 这里分享给大家. 配上图与参考资料.
插入排序
def insert_sort! (0...self.length).to_a.each do |j| key = self[j] i = j - 1; while i >= 0 and self[i] > key self[i+1] = self[i] i = i-1 end self[i+1] = key end self end
冒泡排序
wikipedia 详解: http://en.wikipedia.org/wiki/Insertion_sort
Problem Solving: Searching and sorting
def bubble_sort! f = 1 while f < self.length (0...(self.length-f)).to_a.each do |i| self[i], self[i+1] = self[i+1], self[i] if self[i] > self[i+1] end f += 1 end self end
鸡尾酒排序
wikipedia 详解: http://en.wikipedia.org/wiki/Cocktail_sort
def cocktail_sort! f = 0 while f < self.length/2 i = 0 while i < self.length - 1 self[i], self[i+1] = self[i+1], self[i] if self[i] > self[i+1] i += 1; end t = self.length - 1 while t > 0 self[t], self[t-1] = self[t-1], self[t] if self[t] < self[t-1] t -= 1 end f += 1 end self end
合并排序
wikipedia 详解: http://en.wikipedia.org/wiki/Merge_sort
def merge_sort! return self if self.size <= 1 left = self[0, self.size/2] right = self[self.size/2, self.size - self.size/2] Array.merge(left.merge_sort, right.merge_sort) end def self.merge(left, right) sorted = [] until left.empty? or right.empty? sorted << (left.first <= right.first ? left.shift : right.shift) end sorted + left + right end
快速排序
wikipedia详解: http://en.wikipedia.org/wiki/Quicksort
三种qicksort的实现方式: http://c2.com/cgi/wiki?QuickSortInRuby
在线图示加语音详解: http://www.csanimated.com/animation.php?t=Quicksort
def quick_sort! return [] if self.empty? x, *a = self left, right = a.partition{|t| t < x} left.quick_sort + [x] + right.quick_sort end
heapSort
wikipedia 详解: http://en.wikipedia.org/wiki/Heapsort
更深入分析: http://www.personal.kent.edu/~rmuhamma/Algorithms/MyAlgorithms/Sorting/heapSort.htm
def heap_sort! # in pseudo-code, heapify only called once, so inline it here ((length - 2) / 2).downto(0) {|start| siftdown(start, length - 1)} # "end" is a ruby keyword (length - 1).downto(1) do |end_| self[end_], self[0] = self[0], self[end_] siftdown(0, end_ - 1) end self end def siftdown(start, end_) root = start loop do child = root * 2 + 1 break if child > end_ if child + 1 <= end_ and self[child] < self[child + 1] child += 1 end if self[root] < self[child] self[root], self[child] = self[child], self[root] root = child else break end end end
最后, 附上完整的ruby实现:
class Array # 插入排序 def insert_sort! (0...self.length).to_a.each do |j| key = self[j] i = j - 1; while i >= 0 and self[i] > key self[i+1] = self[i] i = i-1 end self[i+1] = key end self end # 快速排序 def quick_sort! return [] if self.empty? x, *a = self left, right = a.partition{|t| t < x} left.quick_sort + [x] + right.quick_sort end # 冒泡排序 def bubble_sort! f = 1 while f < self.length (0...(self.length-f)).to_a.each do |i| self[i], self[i+1] = self[i+1], self[i] if self[i] > self[i+1] end f += 1 end self end # 鸡尾酒排序(>_<) def cocktail_sort! f = 0 while f < self.length/2 i = 0 while i < self.length - 1 self[i], self[i+1] = self[i+1], self[i] if self[i] > self[i+1] i += 1; end t = self.length - 1 while t > 0 self[t], self[t-1] = self[t-1], self[t] if self[t] < self[t-1] t -= 1 end f += 1 end self end # 合并排序 def merge_sort! return self if self.size <= 1 left = self[0, self.size/2] right = self[self.size/2, self.size - self.size/2] Array.merge(left.merge_sort, right.merge_sort) end def self.merge(left, right) sorted = [] until left.empty? or right.empty? sorted << (left.first <= right.first ? left.shift : right.shift) end sorted + left + right end # heap排序 def heap_sort! # in pseudo-code, heapify only called once, so inline it here ((length - 2) / 2).downto(0) {|start| siftdown(start, length - 1)} # "end" is a ruby keyword (length - 1).downto(1) do |end_| self[end_], self[0] = self[0], self[end_] siftdown(0, end_ - 1) end self end def siftdown(start, end_) root = start loop do child = root * 2 + 1 break if child > end_ if child + 1 <= end_ and self[child] < self[child + 1] child += 1 end if self[root] < self[child] self[root], self[child] = self[child], self[root] root = child else break end end end %w(insert quick bubble cocktail merge heap).each do |metd| define_method("#{metd}_sort") do self.dup.send("#{metd.to_s}_sort!") end endendp b = ((1..100).to_a + (20..80).to_a).shuffle.sample(19)p b.methods.grep /_sort/p b.insert_sortp b.bubble_sortp b.quick_sortp b.cocktail_sortp b.merge_sortp b.heap_sort
转自:https://ruby-china.org/topics/20569
0 0
- 经典排序算法资料及 ruby 实现
- 经典排序算法实现
- 经典算法归并排序的分析及PHP实现
- Java实现经典排序算法及复杂度稳定性分析
- 经典排序算法的详细分析及C++实现代码
- Java实现经典排序算法及复杂度稳定性分析
- Ruby实现的各种排序算法
- 经典排序算法----选择排序算法及交换两个数据的正确实现(不稳定)
- 经典排序算法-C实现
- C#实现经典排序算法
- 经典排序算法-C实现
- 经典排序算法-C实现
- 经典排序算法c实现
- 经典排序算法js实现
- Python:经典排序算法实现
- python实现经典排序算法
- 经典排序算法C++实现
- 经典排序算法JAVA实现
- 杭电 2569 彼岸 (递推 2 *-1,1*-2)
- 深入探索C++对象模型:第四章 Function语意学
- UIButton事件
- 商店买你伤筋动骨卜固原市独一份师范山东体育是短头发是的繁体
- hit2255
- 经典排序算法资料及 ruby 实现
- 扫地出门,受打击古生代讣u影士大夫是的法庭上
- 的无情刻都劝我离开的乐趣网的,‘权威
- ios常用宏定义
- wpf SnapsToDevicePixels
- DSAFSADASD
- HDU 2795 Billboard //线段树简单应用
- 发个Android平台上的注入代码
- this关键字的含义和final关键字的特点