Algorithm
這篇筆記是我參考【演算法圖鑑】和網路資源所製作。如果內容有誤,還請不吝賜教!
import random as rd
from math import inf
from time import time as t
def slsort(n: list, reverse=False):
sort = n
for i in range(len(n) - 1):
mi = [0, inf]
for j in range(i, len(n)):
if sort[j] < mi[1]:
mi = [j, sort[j]]
sort[i], sort[mi[0]] = sort[mi[0]], sort[i]
if reverse:
return sort[::-1]
else:
return sort
print(slsort(list(rd.randint(1, 50) for i in range(10))))
# execution time
n = [i for i in range(1000, 0, -1)]
start = t()
for cases in range(50):
slsort(n)
print((t() - start) / 50)
# time : 0.0551131010055542 second
import random as rd
from time import time as t
def insort(n: list, reverse=False):
sort = n
for i in range(len(sort)):
for j in range(i):
if sort[j] > sort[i]:
sort.insert(j, sort.pop(i))
if reverse:
return sort[::-1]
else:
return sort
print(insort(list(rd.randint(1, 50) for i in range(10))))
# execution time
n = [i for i in range(1000, 0, -1)]
start = t()
for cases in range(50):
insort(n)
print((t() - start) / 50)
# time : 0.05066179275512695 second
(P.S. following shows how to sort the sequence in ascending order)
import random as rd
from time import time as t
def bbsort(n: list, reverse=False):
sort = n
for i in range(len(n) - 1, 0, -1):
for j in range(i):
if sort[j] > sort[j + 1]:
sort[j], sort[j + 1] = sort[j + 1], sort[j]
if reverse:
return sort[::-1]
else:
return sort
print(bbsort(list(rd.randint(1, 10) for i in range(10))))
# execution time
n = [i for i in range(1000, 0, -1)]
start = t()
for cases in range(50):
bbsort(n)
print((t() - start) / 50)
# time : 0.061395759582519534 second
Quick sort requires a very important algorithm - D&C (Divide and Conquer). D&C means for questions that are divisible, we can divide them into plenty of subproblems, and solutions for subproblems can help us infer, and resolve the original problem.
sort(
) = sort( ) + [ ] + sort( )
P.S. Boundary conditions of sort() :
define sort():
if length of:
return
Average complexity of quick sort is
However, worst case
import sys
import random as rd
from time import time as t
sys.setrecursionlimit(10000)
def qksort(n: list, reverse=False):
sort = n
if len(sort) <= 1:
return sort
left, right = [], []
for i in sort[1:]:
if i < sort[0]:
left.append(i)
else:
right.append(i)
sort = qksort(left) + [sort[0]] + qksort(right)
if reverse:
return sort[::-1]
else:
return sort
print(qksort(list(rd.randint(1, 50) for i in range(10))))
# execution time
# 1. average case
n = list(rd.randint(1, 10000) for i in range(1000))
start = t()
for cases in range(50):
qksort(n)
print((t() - start) / 50)
# time : 0.0017751836776733398 second
# Way more faster than bubble sort!!!
# 2. worst case
n = [i for i in range(1000, 0, -1)]
start = t()
for cases in range(50):
qksort(n)
print((t() - start) / 50)
# time : 0.06175748348236084 second
# As slow as selection sort :(
Similar to quick sort, merge-sort uses D&C and recursion likewisely.
sort(
) = merge(sort( ) + sort( ))
P.S. Definition of sort() :define sort(
):
if length of:
return
Divideinto and
Sort() and Sort( )
sorted_= Merge( , )
return sorted_
import sys
import random as rd
from time import time as t
sys.setrecursionlimit(10000)
def mgsort(n: list, reverse=False) -> list:
sort = n
if len(sort) <= 1:
return sort
mid = int(len(sort) / 2 + 0.5)
l, r = mgsort(sort[:mid]), mgsort(sort[mid:])
sort = []
while l and r:
if l[0] < r[0]:
sort.append(l.pop(0))
else:
sort.append(r.pop(0))
sort.extend(l + r)
if reverse:
return sort[::-1]
else:
return sort
print(mgsort(list(rd.randint(1, 50) for i in range(10))))
# execution time
n = [i for i in range(1000, 0, -1)]
start = t()
for cases in range(50):
mgsort(n)
print((t() - start) / 50)
# time : 0.0025319910049438478 second
# Way more faster than bubble sort!!!