Algorithm PAssignment 2
Algorithm PAssignment 2
1.HEAP_SORT
In [2]: import random
import time
def heapify(arr,n,i):
largest=i
l=2*i+1
r=2*i+2
largest=l
largest=r
if largest !=i:
arr[i],arr[largest]=arr[largest],arr[i]
heapify(arr, n, largest)
def max_heap(arr):
ln=len(arr)
for i in range(ln//2-1,-1,-1):
heapify(arr,ln,i)
def heap_sort(arr):
max_heap(arr)
ln=len(arr)
heapify(arr, i, 0)
print(arr)
heap_sort(arr)
print(arr)
[82, 52, 17, 14, 78, 46, 50, 67, 55, 31, 73, 36, 67, 19, 93, 16, 24, 9, 35, 87]
[9, 14, 16, 17, 19, 24, 31, 35, 36, 46, 50, 52, 55, 67, 67, 73, 78, 82, 87, 93]
HeapSort_Analysis
From the graph bellow ,we see that the graph looks like a nlogn graph,so the complexcity of heapsort is 0(nlogn) (n=size of the heap)
In [39]: elements=[]
times=[]
for i in range(50):
ln=len(l1)
elements.append(ln)
start=time.time()
heap_sort(l1)
end=time.time()
times.append(end-start)
plt.xlabel('list_length')
plt.ylabel('time_complexcity')
plt.scatter(elements,times)
plt.grid()
plt.show()
2. quicksort
In [3]: import random
def partition(arr,low,high):
p=arr[high]
i=low-1
for j in range(low,high):
if arr[j]<=p:
i+=1
arr[i],arr[j]=arr[j],arr[i]
arr[i+1],arr[high]=arr[high],arr[i+1]
return i+1
def quick_sort(arr,low,high):
if low<high:
pi=partition(arr,low,high)
quick_sort(arr,low,pi-1)
quick_sort(arr,pi+1,high)
print(arr)
high=len(arr)
quick_sort(arr,0,high-1)
print(arr)
[29, 41, 33, 28, 11, 27, 35, 25, 25, 9, 2, 50, 27, 47, 47, 6, 22, 0, 35, 23]
[0, 2, 6, 9, 11, 22, 23, 25, 25, 27, 27, 28, 29, 33, 35, 35, 41, 47, 47, 50]
Quick_sort_analysis
From the graph bellow ,we see that the graph looks like a nlogn graph,so the complexcity of quicksort is 0(nlogn) (n=size of the list)
elements=[]
times=[]
for i in range(100):
ln=len(arr)
elements.append(ln)
start=time.time()
quick_sort(arr,0,ln-1)
end=time.time()
times.append(end-start)
plt.xlabel('list_length')
plt.ylabel('time_complexcity')
plt.plot(elements,times,'or')
plt.grid()
plt.show()
import time
def randomized_partition(arr,l,h):
r=random.randrange(l,h)
arr[l]=arr[r]
po=partition(arr, l, h)
return po
def partition(arr,l,h):
p=arr[h]
i=l-1
for j in range(l,h):
if arr[j]<=p:
i+=1
arr[i],arr[j]=arr[j],arr[i]
arr[i+1],arr[h]=arr[h],arr[i+1]
return i+1
def quick_sort(arr,l,h):
if l<h:
p=randomized_partition(arr, l, h)
quick_sort(arr, l, p-1)
quick_sort(arr, p+1, h)
print(l)
quick_sort(l, 0, len(l)-1)
print(l)
print("-----------------------------------")
elements=[]
times=[]
for i in range(100):
ln=len(l1)
elements.append(ln)
start=time.time()
quick_sort(l1,0,ln-1)
end=time.time()
times.append(end-start)
plt.xlabel('list_length')
plt.ylabel('time_complexcity')
plt.plot(elements,times,'ob')
plt.grid()
plt.show()
-----------------------------------
left = i*2+1
right = i*2+2
small = i
small = left
small = right
if small != i:
min_heapify(a,small,n)
def build_min_heap(l):
n=len(l)
for i in range(n//2,-1,-1):
min_heapify(l,i,len(l)-1)
def merge(arr):
l = []
for i in arr:
for j in i:
l.append(j)
build_min_heap(l)
for i in range(len(l)-1,-1,-1):
min_heapify(l,0,i)
return l
arr = []
for i in range(n):
print('After sorting',merge(arr))
list 1: 87 0 14 5 36 69 5
list 2: 12 87 58 99 0 1 5
list 3: 65 3 1 4 8 254
After sorting [254, 99, 87, 87, 69, 65, 58, 36, 14, 12, 8, 5, 5, 5, 4, 3, 1, 1, 0, 0]
4.Counting Sort
In [2]: import random
def counting_sort(a):
l=max(a)
ln=len(a)
c=[0]*(l+1)
b=[0]*ln
for j in range(0,ln):
c[a[j]]+=1
for i in range(1,l+1):
c[i]=c[i]+c[i-1]
for j in range(ln-1,-1,-1):
b[c[a[j]]-1]=a[j]
c[a[j]]-=1
return b
print(arr)
s=counting_sort(arr)
print(s)
[54, 26, 97, 59, 34, 45, 91, 31, 69, 34, 57, 44, 32, 70, 18, 46, 22, 91, 100, 17]
[17, 18, 22, 26, 31, 32, 34, 34, 44, 45, 46, 54, 57, 59, 69, 70, 91, 91, 97, 100]
Counting Sort_analysis
from the graph we see that time complexcity of the counting_sort is linear 0(n) (n=size of the list)
import time
elements=[]
times=[]
for i in range(50):
ln=len(l1)
elements.append(ln)
start=time.time()
counting_sort(l1)
end=time.time()
times.append(end-start)
plt.xlabel('list_length')
plt.ylabel('time_complexcity')
plt.plot(elements,times,'ro')
plt.grid()
plt.show()
5.Bucket Sort
In [4]: import random
def insertion_sort(b):
for i in range(1,len(b)):
x = b[i]
j = i-1
j = j-1
b[j+1] = x
return b
def max(l):
max = 0
for i in l:
if max<i:
max = i
return max
def bucket(l):
mx = max(l)
ln = len(l)
buc = []
for i in range(ln+1):
buc.append([])
for i in l:
index = int(round((i/mx)*ln,2))
buc[index].append(i)
for i in buc:
i = insertion_sort(i)
return buc
print(l)
for i in bucket(l):
for j in i:
print(j,end=" ")
import time
times=[]
elements=[]
l=[]
for i in range(100):
ln=len(arr)
elements.append(ln)
start=time.time()
b=bucket(arr)
end=time.time()
times.append(end-start)
plt.plot(elements,times,'ro')
plt.xlabel('list_length')
plt.ylabel('time_complexity')
plt.grid()
plt.show()