From 7f9cf980f355b87de6ea6c820be9e567e9227439 Mon Sep 17 00:00:00 2001 From: trollhase Date: Sat, 28 Sep 2013 06:12:19 +0200 Subject: [PATCH] Sorting Algorithm Tester --- sorting_algorithms.py | 199 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 sorting_algorithms.py diff --git a/sorting_algorithms.py b/sorting_algorithms.py new file mode 100644 index 0000000..92d218f --- /dev/null +++ b/sorting_algorithms.py @@ -0,0 +1,199 @@ + +from random import randint +from time import clock + +class SortAlgorithm: + def __init__(self): + self.swaps = 0 + self.vgls = 0 + + def sort(self,a): + raise Exception("Fail") + + def swap(self,a,i,j): + self.swaps += 1 + a[i],a[j] = a[j],a[i] + + def set(self,a,i,v): + self.swaps += 1 + a[i] = v + + def vgl(self,b): + self.vgls += 1 + return b + +class BubbleSort(SortAlgorithm): + def sort(self,a): + n = len(a) + swapped = True + while swapped and n > 1: + swapped = False + for i in range(0,n-1): + if self.vgl(a[i] > a[i+1]): + self.swap(a,i,i+1) + swapped = True + n-=1 + return a + +class InsertSort(SortAlgorithm): + def sort(self,a): + for i in range(1,len(a)): + t = a[i] + j = i-1 + while j >= 0 and self.vgl(a[i] > t): + self.set(a,j,a[j+1]) + j-=1 + #a[j+1] = t + self.set(a, j+1, t) + return a + +class QuickSort(SortAlgorithm): + def sort(self,a): + self.qsort(a, 0, len(a)-1) + return a + + def qsort(self,a, left, right): + if left < right: + pivot = self.seperate(a, left, right) + self.qsort(a, left, pivot - 1) + self.qsort(a, pivot+1, right) + + def seperate(self, a, left, right): + i = left + j = right-1 + pivot = a[right] + + while i < j: + while self.vgl(a[i] <= pivot) and i < right: i+=1 + while self.vgl(a[i] >= pivot) and j > left: j-=1 + + if i < j: + self.swap(a,i,j) + + if a[i] > pivot: + self.swap(a,i,right) + + return i + +class HeapSort(SortAlgorithm): + def sort(self,a): + self.heapsort(a) + return a + + def heapify(self, data, i, w): + #indexes = filter(lambda v: v < w, [i,2*(i+1)-1,2*(i+1)]) + #largest = max(indexes,key=lambda v: data[v]) + r = 2*(i+1) + l = r-1 + largest = i + if l < w and self.vgl(data[l] < data[largest]): + largest = l + if r < w and self.vgl(data[r] < data[largest]): + largest = r + if largest != i: + self.swap(data,i,largest) + self.heapify(data, largest, w) + + def build_heap(self, data): + w = len(data) + i = w/2-1 + while i>=0: + self.heapify(data, i, w) + i-=1 + + def heapsort(self,data): + self.build_heap(data) + i = len(data)-1 + while i > 0: + self.swap(data,i,0) + self.heapify(data, 0, i) + i-=1 + +class MergeSort(SortAlgorithm): + def sort(self, a): + return self.mergesort(a) + + def mergesort(self,a): + if len(a) <= 1: + return a + else: + n = len(a)/2 + return self.merge(self.mergesort(a[:n] or []), self.mergesort(a[n:] or [])) + + def merge(self,a,b): + l = [] + while True: + if len(a) == 0: + l += b + break + if len(b) == 0: + l += a + break + + if self.vgl(a[0] < b[0]): + l.append(a[0]) + a = a[1:] + else: + l.append(b[0]) + b = b[1:] + self.swaps+=1 + return l + +class ShellSort(SortAlgorithm): + def sort(self,a): + spalten = [2147483647, 1131376761, 410151271, 157840433, 58548857, 21521774, 8810089, 3501671, 1355339, 543749, 213331, + 84801, 27901, 11969, 4711, 1968, 815, 271, 111, 41, 13, 4, 1] + + for k in range(0,23): + h = spalten[k] + for i in range(h,len(a)): + t = a[i] + j = i + while j>=h and self.vgl(a[j-h]>t): + #a[j] = a[j-h] + self.swap(a,j,j-h) + j-=h + a[j] = t + return a + +class SelectSort(SortAlgorithm): + def sort(self,a): + n = len(a) + left = 0 + while left < n: + m = left + for i in range(left,n): + if self.vgl(a[i] < a[m]): + m = i + self.swap(a,m,left) + left+=1 + return a + +class SortTester: + def __init__(self, algorithms): + self.algorithms = algorithms + + def test(self, size=1000): + results = {} + + data = list([ randint(0, size) for i in range(0,size) ]) + + for algorithm in self.algorithms: + print "Testing %s..." % algorithm.__name__ + inst = algorithm() + c = data[:] + inst.sort(c) + results[algorithm] = (inst.vgls,inst.swaps) + + return results + +def main(): + result = SortTester([BubbleSort,InsertSort,QuickSort,HeapSort,MergeSort,ShellSort,SelectSort]).test(size=1000) + for cls, r in result.items(): + print "%-12s: %d compares, %d swaps" % (cls.__name__, r[0],r[1]) + +def test(): + print ShellSort().sort([randint(0,500) for i in range(0,100)]) + +if __name__ == '__main__': + main()