-
Notifications
You must be signed in to change notification settings - Fork 0
/
quicksort.coffee
137 lines (121 loc) · 2.79 KB
/
quicksort.coffee
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
insertionsort = (a, order, start, post_end)->
i = start + 1
while i < post_end
j = i
v = a[i]
while j > start and order(a[j - 1], v) > 0
a[j] = a[j - 1]
j--
a[j] = v
i++
undefined
quicksort = (a , s, e)->
if e > s
i = (s + e) / 2 |0
v = a[i]
initial_s = s
initial_e = e
while e > s
while i < e and v <= a[e]
e--
a[i] = a[e]
a[e] = v
i = e
while s < i and v >= a[s]
s++
a[i] = a[s]
a[s] = v
i = s
quicksort(a, initial_s, i - 1)
quicksort(a , i + 1, initial_e)
undefined
else
undefined
generic_quicksort = (a, order, s, e)->
if e - s > 30
i = (s + e) / 2 |0
v = a[i]
initial_s = s
initial_e = e
while e > s
while i < e and order(v, a[e]) <= 0
e--
a[i] = a[e]
a[e] = v
i = e
while s < i and order(v, a[s]) >= 0
s++
a[i] = a[s]
a[s] = v
i = s
generic_quicksort(a, order, initial_s, i - 1)
generic_quicksort(a , order, i + 1, initial_e)
undefined
else
insertionsort(a, order, s, e + 1)
undefined
shuffle = (a)->
l = a.length
for i in [0...l]
t = a[i]
r = Math.random() * i |0
a[i] = a[r]
a[r] = t
undefined
confirmation = (a)->
for i in [0...(a.length - 2)]
if a[i] > a[i + 1]
return false
true
order = (a, b)-> a - b
less = (a, b)-> a < b
{Heap} = require "./heap"
{smoothsort} = require "./smooth"
MAX = Math.pow(10, 7)
a = (i for i in [0...MAX])
shuffle a
b = a.slice()
# console.log "quicksorting"
# time = Date.now()
# quicksort a, 0 , a.length - 1
# console.log "time for quicksort", Date.now() - time
# console.log "confirmation", confirmation(a)
# a = b.slice()
# b = a.slice()
console.log "generic_quicksorting"
time = Date.now()
generic_quicksort a, order, 0 , a.length - 1
console.log "time for generic_quicksort", Date.now() - time
console.log "confirmation", confirmation(a)
a = b.slice()
# console.log "slow heapsorting"
# time = Date.now()
# h = new Heap(((a, b)-> a < b), b)
# res = []
# while h.size()
# res.push h.pop()
# console.log "time for slow heapsorting", Date.now() - time
# console.log "confirmation", confirmation(res)
console.log "smoothsorting"
time = Date.now()
smoothsort a, (a, b)-> a < b
console.log "time for smoothsort", Date.now() - time
console.log "confirmation", confirmation(b)
console.log "insertionsorting"
time = Date.now()
insertionsort b, order, 0 , a.length
console.log "time for insertionsort", Date.now() - time
console.log "confirmation", confirmation(b)
# console.log "nativesorting"
# time = Date.now()
# a.sort(order)
# console.log "time for nativesort", Date.now() - time
# console.log "confirmation", confirmation(a)
# console.log "constructing bin heap"
# time = Date.now()
# h = new Heap(less, a)
# console.log Date.now() - time
# console.log "constructing smooth heap"
# time = Date.now()
# smoothsort(a, less)
# console.log Date.now() - time