-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathPythonSorts.py
112 lines (97 loc) · 2.38 KB
/
PythonSorts.py
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
#!/usr/bin/python
import sys
import random
import math
from random import randint
# author: Daniel Eynis for Daniel Leblanc's CS350 class
# heap sort ####################
def compareElem(elem1, elem2):
if elem1 < elem2:
return -1
elif elem1 > elem2:
return 1
return 0
def heapSort(listA):
lenA = len(listA)
buildMaxHeap(listA, lenA)
while lenA > 1:
lenA -= 1
listA[0], listA[lenA] = listA[lenA], listA[0]
heapifyList(listA, lenA, 0)
return listA
def heapifyList(listA, lenA, i):
left = (i * 2) + 1
right = (i * 2) + 2
largest = i
if left < lenA and compareElem(listA[left], listA[largest]) > 0:
largest = left
if right < lenA and compareElem(listA[right], listA[largest]) > 0:
largest = right
if largest != i:
listA[i], listA[largest] = listA[largest], listA[i]
heapifyList(listA, lenA, largest)
def buildMaxHeap(listA, lenA):
for i in range(int(math.floor(lenA/2)), -1, -1):
heapifyList(listA, lenA, i)
#################################
# quicksort ###############
def quickSort(listA, lowA, highA):
if lowA >= highA:
return
pivot = listA[randint(lowA, highA)]
i = lowA
j = highA
while i <= j:
while listA[i] < pivot:
i += 1
while listA[j] > pivot:
j -= 1
if i <= j:
listA[i], listA[j] = listA[j], listA[i]
i += 1
j -= 1
quickSort(listA, lowA, j)
quickSort(listA, i, highA)
##############################
# merge sort ################
def mergeSort(listA):
lenA = len(listA)
if lenA <= 1:
return listA
mid = lenA/2
listB = mergeSort(listA[:mid])
listC = mergeSort(listA[mid:])
return mergeLists(listB, listC)
def mergeLists(listB, listC):
listD = []
lenB, lenC = len(listB), len(listC)
i, j = 0, 0
while i < lenB and j < lenC:
if listB[i] <= listC[j]:
listD.append(listB[i])
i += 1
else:
listD.append(listC[j])
j += 1
if i == lenB:
listD.extend(listC[j:])
else:
listD.extend(listB[i:])
return listD
##############################
# bucket sort ######################
def bucketSort(listA, bucketSize = 10000):
lenA = len(listA)
minA = min(listA)
maxA = max(listA)
rangeA = maxA - minA
finalList = []
numBuckets = (rangeA/bucketSize) + 1
table = [[] for x in xrange(0, numBuckets)]
for i in range(0 , lenA):
table[int(math.floor((listA[i]-minA)/bucketSize))].append(listA[i])
for i in range(0, numBuckets):
table[i].sort()
finalList.extend(table[i])
return finalList
#####################################