algorithm_selector 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.DS_Store +0 -0
- data/.gitignore +1 -3
- data/.yardoc/checksums +2 -2
- data/.yardoc/object_types +0 -0
- data/.yardoc/objects/root.dat +0 -0
- data/README.md +3 -2
- data/doc/AlgorithmSelector.html +2 -2
- data/doc/BSTNode.html +19 -19
- data/doc/BinaryTree.html +43 -43
- data/doc/LinkNode.html +19 -19
- data/doc/LinkedList.html +69 -69
- data/doc/Queue.html +49 -49
- data/doc/Searches.html +64 -64
- data/doc/Sorts.html +110 -27
- data/doc/Stack.html +59 -59
- data/doc/_index.html +6 -1
- data/doc/class_list.html +1 -1
- data/doc/file.README.html +5 -3
- data/doc/index.html +5 -3
- data/doc/method_list.html +129 -49
- data/doc/top-level-namespace.html +2 -2
- data/lib/.DS_Store +0 -0
- data/lib/algorithm_selector.rb +104 -1
- data/lib/algorithm_selector/version.rb +1 -1
- metadata +2 -2
@@ -88,7 +88,7 @@
|
|
88
88
|
|
89
89
|
|
90
90
|
|
91
|
-
<strong class="classes">Classes:</strong> <span class='object_link'><a href="BSTNode.html" title="BSTNode (class)">BSTNode</a></span>, <span class='object_link'><a href="BinaryTree.html" title="BinaryTree (class)">BinaryTree</a></span>, <span class='object_link'><a href="LinkNode.html" title="LinkNode (class)">LinkNode</a></span>, <span class='object_link'><a href="LinkedList.html" title="LinkedList (class)">LinkedList</a></span>, <span class='object_link'><a href="Queue.html" title="Queue (class)">Queue</a></span>, <span class='object_link'><a href="Searches.html" title="Searches (class)">Searches</a></span>, <span class='object_link'><a href="Sorts.html" title="Sorts (class)">Sorts</a></span>, <span class='object_link'><a href="Stack.html" title="Stack (class)">Stack</a></span>
|
91
|
+
<strong class="classes">Classes:</strong> <span class='object_link'><a href="BSTNode.html" title="BSTNode (class)">BSTNode</a></span>, <span class='object_link'><a href="BinaryMinHeap.html" title="BinaryMinHeap (class)">BinaryMinHeap</a></span>, <span class='object_link'><a href="BinaryTree.html" title="BinaryTree (class)">BinaryTree</a></span>, <span class='object_link'><a href="LinkNode.html" title="LinkNode (class)">LinkNode</a></span>, <span class='object_link'><a href="LinkedList.html" title="LinkedList (class)">LinkedList</a></span>, <span class='object_link'><a href="Queue.html" title="Queue (class)">Queue</a></span>, <span class='object_link'><a href="Searches.html" title="Searches (class)">Searches</a></span>, <span class='object_link'><a href="Sorts.html" title="Sorts (class)">Sorts</a></span>, <span class='object_link'><a href="Stack.html" title="Stack (class)">Stack</a></span>
|
92
92
|
|
93
93
|
|
94
94
|
</p>
|
@@ -104,7 +104,7 @@
|
|
104
104
|
</div>
|
105
105
|
|
106
106
|
<div id="footer">
|
107
|
-
Generated on Sat Jul
|
107
|
+
Generated on Sat Jul 30 20:58:51 2016 by
|
108
108
|
<a href="http://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
|
109
109
|
0.9.4 (ruby-2.1.2).
|
110
110
|
</div>
|
data/lib/.DS_Store
CHANGED
Binary file
|
data/lib/algorithm_selector.rb
CHANGED
@@ -62,7 +62,8 @@ class Sorts
|
|
62
62
|
insertion_sort: display_time(Proc.new {insertion_sort(data_set)}, trials),
|
63
63
|
selection_sort: display_time(Proc.new {selection_sort(data_set)}, trials),
|
64
64
|
merge_sort: display_time(Proc.new {merge_sort(data_set)}, trials),
|
65
|
-
quick_sort: display_time(Proc.new {quick_sort(data_set)}, trials)
|
65
|
+
quick_sort: display_time(Proc.new {quick_sort(data_set)}, trials),
|
66
|
+
heap_sort: display_time(Proc.new {heap_sort(data_set)}, trials)
|
66
67
|
}
|
67
68
|
}
|
68
69
|
end
|
@@ -197,6 +198,21 @@ class Sorts
|
|
197
198
|
right = data_set.select {|el| el > pivot}
|
198
199
|
quick_sort(left) + [pivot] + quick_sort(right)
|
199
200
|
end
|
201
|
+
|
202
|
+
# Quick sort
|
203
|
+
# Worst-Case Space Complexity: O(1)
|
204
|
+
# Averge-Case Time Complexity: O(n log(n))
|
205
|
+
# Worst-Case Time Complexity: O(n log(n))
|
206
|
+
def heap_sort(data_set)
|
207
|
+
(2..data_set.length).to_a.each do |idx|
|
208
|
+
BinaryMinHeap.heapify_up(data_set, idx - 1, idx)
|
209
|
+
end
|
210
|
+
(2..data_set.length).to_a.reverse.each do |idx|
|
211
|
+
data_set[idx - 1], data_set[0] = data_set[0], data_set[idx - 1]
|
212
|
+
BinaryMinHeap.heapify_down(data_set, 0, idx - 1)
|
213
|
+
end
|
214
|
+
data_set.reverse!
|
215
|
+
end
|
200
216
|
end
|
201
217
|
|
202
218
|
# Searches class
|
@@ -570,3 +586,90 @@ class BSTNode
|
|
570
586
|
@right = right
|
571
587
|
end
|
572
588
|
end
|
589
|
+
|
590
|
+
# MinHeap helper class for Heap Sort
|
591
|
+
class BinaryMinHeap
|
592
|
+
def initialize(&prc)
|
593
|
+
@store = []
|
594
|
+
@prc = prc || Proc.new { |el1, el2| el1 <=> el2 }
|
595
|
+
end
|
596
|
+
|
597
|
+
def count
|
598
|
+
@store.length
|
599
|
+
end
|
600
|
+
|
601
|
+
def extract
|
602
|
+
raise "no element to extract" if count == 0
|
603
|
+
val = @store[0]
|
604
|
+
@store.pop if count == 1
|
605
|
+
if count > 1
|
606
|
+
@store[0] = @store.pop
|
607
|
+
self.class.heapify_down(@store, 0, &@prc)
|
608
|
+
end
|
609
|
+
val
|
610
|
+
end
|
611
|
+
|
612
|
+
def peek
|
613
|
+
raise "no element to peek" if count == 0
|
614
|
+
@store[0]
|
615
|
+
end
|
616
|
+
|
617
|
+
def push(val)
|
618
|
+
@store.push(val)
|
619
|
+
self.class.heapify_up(@store, count - 1, &@prc)
|
620
|
+
end
|
621
|
+
|
622
|
+
protected
|
623
|
+
attr_accessor :prc, :store
|
624
|
+
|
625
|
+
public
|
626
|
+
def self.child_indices(len, parent_index)
|
627
|
+
[2 * parent_index + 1, 2 * parent_index + 2].select { |idx| idx < len }
|
628
|
+
end
|
629
|
+
|
630
|
+
def self.parent_index(child_index)
|
631
|
+
raise "root has no parent" if child_index == 0
|
632
|
+
(child_index - 1) / 2
|
633
|
+
end
|
634
|
+
|
635
|
+
def self.heapify_down(array, parent_idx, len = array.length, &prc)
|
636
|
+
prc ||= Proc.new { |el1, el2| el1 <=> el2 }
|
637
|
+
|
638
|
+
left_child, right_child = child_indices(len, parent_idx)
|
639
|
+
|
640
|
+
parent = array[parent_idx]
|
641
|
+
|
642
|
+
children = []
|
643
|
+
children.push(array[left_child]) if left_child
|
644
|
+
children.push(array[right_child]) if right_child
|
645
|
+
|
646
|
+
if children.all? { |child| prc.call(parent, child) <= 0 }
|
647
|
+
return array
|
648
|
+
end
|
649
|
+
|
650
|
+
swap_idx = nil
|
651
|
+
if children.length == 1
|
652
|
+
swap_idx = left_child
|
653
|
+
else
|
654
|
+
swap_idx =
|
655
|
+
prc.call(children[0], children[1]) == -1 ? left_child : right_child
|
656
|
+
end
|
657
|
+
|
658
|
+
array[parent_idx], array[swap_idx] = array[swap_idx], parent
|
659
|
+
heapify_down(array, swap_idx, len, &prc)
|
660
|
+
end
|
661
|
+
|
662
|
+
def self.heapify_up(array, child_idx, len = array.length, &prc)
|
663
|
+
prc ||= Proc.new { |el1, el2| el1 <=> el2 }
|
664
|
+
return array if child_idx == 0
|
665
|
+
|
666
|
+
parent_idx = parent_index(child_idx)
|
667
|
+
child, parent = array[child_idx], array[parent_idx]
|
668
|
+
if prc.call(child, parent) >= 0
|
669
|
+
return array
|
670
|
+
else
|
671
|
+
array[child_idx], array[parent_idx] = parent, child
|
672
|
+
heapify_up(array, parent_idx, len, &prc)
|
673
|
+
end
|
674
|
+
end
|
675
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: algorithm_selector
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- joseph
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-07-
|
11
|
+
date: 2016-07-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|