In [19]:
import random
import statistics
import matplotlib.pyplot as plt
%matplotlib inline
In [20]:
def randomquicksort(alist,times):
comp = [0]
randomquicksorthelper(alist,0,len(alist)-1,comp)
times.append(comp[0])
In [21]:
def randomquicksorthelper(alist,first,last,comp):
if first<last:
r = randompartition(alist,first,last)
splitpoint = r[0]
tmp = comp.pop()
comp.append(tmp+r[1])
randomquicksorthelper(alist,first,splitpoint-1,comp)
randomquicksorthelper(alist,splitpoint+1,last,comp)
In [22]:
def randompartition(alist,first,last):
pivotvalue = alist[first]
i =first-1
compspart=0
for j in range(first,last-1):
compspart = compspart + 1
if alist[j]<=pivotvalue:
i+=1
temp = alist[j]
alist[j] = alist[i]
alist[i] = temp
temp = alist[i+1]
alist[i+1] = alist[last]
alist[last] = temp
return i+1,compspart
In [23]:
def randomquicksorttimedistrib(s,r):
# Create an array of 1 .. n
n=s
runs=r
x = []
for i in range(1,n+1):
x.append(n+1-i)
# Run quicksort for each permutation
tlist =[]
for p in range(1,runs+1):
y = list(x)
randomquicksort(y,tlist)
plt.hist(tlist)
plt.title("Number of comparison of Quicksort for all permutaions")
plt.xlabel("Comparisons of elements")
plt.ylabel("Frequency")
plt.show()
print("n",n)
print("runs",runs)
print("mean",statistics.mean(tlist))
print("stdev",statistics.stdev(tlist))
print("min",min(tlist))
print("max",max(tlist))
In [24]:
randomquicksorttimedistrib(100,10000)
In [ ]: