Skip to content

Commit 2b41197

Browse files
committed
Fixed Bucket Sort and added Gnome, Comb and Cocktail Sort
1 parent 84485d9 commit 2b41197

File tree

3 files changed

+154
-32
lines changed

3 files changed

+154
-32
lines changed

src/main/main.py

Lines changed: 65 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,75 @@
33
44
@author: patterson
55
'''
6+
7+
from pyqtgraph.python2_3 import xrange
68
import random
9+
import time
710

811
from sort.sort import bubble, insertion, selection, quick, merge, shell, heap, \
9-
counting, radix, bucket
12+
counting, radix, bucket, gnome, comb, cocktail
1013

1114

1215
if __name__ == '__main__':
13-
vet = [i for i in random.sample(range(100), 10)]
14-
# vet = [171]
15-
print(vet)
16-
print( bucket(vet) )
1716

18-
19-
17+
algorithms = [ 'Bubble', 'Insertion', 'Selection', 'Quick', 'Merge',
18+
'Shell', 'Heap', 'Counting', 'Radix', 'Bucket', 'Gnome', 'Comb', 'Cocktail' ]
19+
20+
while True:
21+
print('\n\n\tSorting Algorithms\n\n')
22+
23+
a_length = int(input('Tamanho do array a ser ordenado: '))
24+
min = int(input('Menor número possível: '))
25+
max = int(input('Maior número possível: '))
26+
27+
vet = [random.randint(min, max) for r in xrange(a_length)]
28+
29+
print('\nVetor gerado: ')
30+
print(vet)
31+
32+
print('\nEscolha um algoritmo de Ordenação: ')
33+
for i, x in enumerate(algorithms):
34+
print(i, ' - ', x)
35+
op = input()
36+
37+
if op == '0':
38+
sort_alg = bubble
39+
elif op == '1':
40+
sort_alg = insertion
41+
elif op == '2':
42+
sort_alg = selection
43+
elif op == '3':
44+
sort_alg = quick
45+
elif op == '4':
46+
sort_alg = merge
47+
elif op == '5':
48+
sort_alg = shell
49+
elif op == '6':
50+
sort_alg = heap
51+
elif op == '7':
52+
sort_alg = counting
53+
elif op == '8':
54+
sort_alg = radix
55+
elif op == '9':
56+
sort_alg = bucket
57+
elif op == '10':
58+
sort_alg = gnome
59+
elif op == '11':
60+
sort_alg = comb
61+
elif op == '12':
62+
sort_alg = cocktail
63+
else:
64+
print('\nOpção inválida.')
65+
66+
print('\nOrdenando pelo método ', algorithms[int(op)], '...')
67+
print('\nVetor ordenado: ')
68+
69+
ini = time.time()
70+
print(sort_alg(vet))
71+
fim = time.time()
72+
print('\n\nTempo total gasto: ', fim-ini)
73+
74+
75+
76+
77+
1.17 KB
Binary file not shown.

src/sort/sort.py

Lines changed: 89 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ def bubble(nlist):
2222
if nlist[j] > nlist[j + 1]:
2323
nlist[j + 1], nlist[j] = nlist[j], nlist[j + 1]
2424
exchanges = True
25+
2526
return nlist
2627

2728
def insertion(nlist):
@@ -39,6 +40,7 @@ def insertion(nlist):
3940
nlist[j + 1] = nlist[j]
4041
j -= 1
4142
nlist[j + 1] = key
43+
4244
return nlist
4345

4446
def selection(nlist):
@@ -53,8 +55,9 @@ def selection(nlist):
5355
for j in range(i + 1, size):
5456
if nlist[j] < nlist[lower]:
5557
lower = j
56-
print(nlist)
58+
5759
nlist[i], nlist[lower] = nlist[lower], nlist[i]
60+
5861
return nlist
5962

6063
def quick(nlist):
@@ -85,6 +88,7 @@ def merge(nlist):
8588
result.append(l.pop(0))
8689

8790
result.extend(l + r)
91+
8892
return result
8993

9094
def shell(nlist):
@@ -123,6 +127,7 @@ def heap(nlist):
123127
for end in range(size - 1, 0, -1):
124128
nlist[end], nlist[0] = nlist[0], nlist[end]
125129
_max_heap(nlist, 0, end - 1)
130+
126131
return nlist
127132

128133
def _max_heap(nlist, root, end):
@@ -195,48 +200,107 @@ def radix(aList):
195200

196201
return nlist
197202

198-
import math
199-
200-
DEFAULT_BUCKET_SIZE = 5
201-
202-
def bucket(array, bucketSize=DEFAULT_BUCKET_SIZE):
203-
if len(array) == 0:
204-
return array
203+
def bucket(aList, bucketSize=5):
204+
nlist = list(aList)
205+
size = len(nlist)
206+
207+
if size < 2:
208+
return nlist
205209

206-
# Determine minimum and maximum values
207-
minValue = array[0]
208-
maxValue = array[0]
209-
for i in range(1, len(array)):
210-
if array[i] < minValue:
211-
minValue = array[i]
212-
elif array[i] > maxValue:
213-
maxValue = array[i]
210+
minValue = min(nlist)
211+
maxValue = max(nlist)
214212

215-
# Initialize buckets
216213
bucketCount = math.floor((maxValue - minValue) / bucketSize) + 1
217214
buckets = []
215+
218216
for i in range(0, bucketCount):
219217
buckets.append([])
220218

221-
# Distribute input array values into buckets
222-
for i in range(0, len(array)):
223-
buckets[math.floor((array[i] - minValue) / bucketSize)].append(array[i])
219+
for i in range(0, size):
220+
buckets[math.floor((nlist[i] - minValue) / bucketSize)].append(nlist[i])
224221

225-
# Sort buckets and place back into input array
226-
array = []
222+
nlist = []
227223
for i in range(0, len(buckets)):
228-
insertion(buckets[i])
224+
buckets[i] = insertion(buckets[i])
229225
for j in range(0, len(buckets[i])):
230-
array.append(buckets[i][j])
226+
nlist.append(buckets[i][j])
231227

232-
return array
228+
return nlist
233229

230+
def gnome(aList):
231+
nlist = list(aList)
232+
size = len(nlist)
234233

234+
if size < 2:
235+
return nlist
235236

237+
pivot = 0
238+
nlist_length = len(nlist)
239+
while pivot < nlist_length - 1:
240+
if nlist[pivot] > nlist[pivot + 1]:
241+
nlist[pivot + 1], nlist[pivot] = nlist[pivot], nlist[pivot + 1]
242+
if pivot > 0:
243+
pivot -= 2
244+
pivot += 1
245+
246+
return nlist
236247

248+
def comb(aList):
249+
nlist = list(aList)
250+
size = len(nlist)
251+
252+
if size < 2:
253+
return nlist
237254

255+
gap = size
256+
swaps = True
238257

258+
while gap > 1 or swaps:
259+
gap = max(1, int(gap / 1.25)) # Minimun gap is 1
260+
swaps = False
261+
262+
for i in range(size - gap):
263+
j = i + gap
239264

265+
if nlist[i] > nlist[j]:
266+
nlist[i], nlist[j] = nlist[j], nlist[i]
267+
swaps = True
268+
print(nlist)
269+
return nlist
270+
271+
def cocktail(aList):
272+
nlist = list(aList)
273+
size = len(nlist)
274+
275+
if size < 2:
276+
return nlist
277+
278+
swapped = True
279+
i = 0
280+
j = size - 1
281+
282+
while i < j and swapped:
283+
for k in range(i, j):
284+
if nlist[k] > nlist[k + 1]:
285+
nlist[k], nlist[k + 1] = nlist[k + 1], nlist[k]
286+
swapped = True
287+
j -= 1
288+
289+
if swapped:
290+
swapped = False
291+
for k in range(j, i, -1):
292+
if nlist[k] < nlist[k - 1]:
293+
nlist[k], nlist[k - 1] = nlist[k - 1], nlist[k]
294+
swapped = True
295+
296+
i += 1
297+
298+
if not swapped:
299+
return nlist
300+
301+
302+
303+
240304

241305

242306

0 commit comments

Comments
 (0)