Python實現 《演算法導論 第三版》中的演算法 第2章 演算法基礎
阿新 • • 發佈:2018-12-11
第2章 演算法基礎
1. 插入排序
P17。插入排序比較簡單。
class InsertionSort:
def sort(self, A):
for i in range(1, len(A)):
temp = A[i]
j = i - 1
while j >= 0 and A[j] > temp:
A[j + 1] = A[j]
j -= 1
A[j + 1] = temp # 不滿條件的下一個位置
return A
def main():
isort= InsertionSort()
A = [9, 8, 7, 6, 5, 4, 10, 12]
print(isort.sort(A))
if __name__ == '__main__':
main()
2. 歸併排序
P17。歸併排序利用了分治法,Python實現與書中的虛擬碼不一樣,這是由於Python的語言特點所導致的。
class MergeSort:
def sort(self, arr):
if len(arr) <= 1:
return arr
mid = len(arr) // 2
left_arr = self.sort(arr[:mid])
right_arr = self.sort(arr[mid:])
return self.merge(left_arr, right_arr)
def merge(self, arr1, arr2):
res = []
i1 = i2 = 0
while i1 < len(arr1) and i2 < len(arr2):
if arr1[i1] < arr2[i2]:
res.append(arr1[i1])
i1 += 1
else:
res.append(arr2[i2])
i2 += 1
if i1 == len(arr1):
res.extend(arr2[i2:])
else:
res.extend(arr1[i1:])
return res
def main():
ms = MergeSort()
A = [9, 8, 7, 6, 5, 4, 10, 12, 1]
print(ms.sort(A))
if __name__ == '__main__':
main()
3. 選擇排序
P16練習2.2-2。
class SelectionSort:
def sort(self, A):
for i in range(0, len(A)):
k = i
# Find the smallest num and record its index
for j in range(k, len(A)):
if A[j] < A[k]:
k = j
if k != i:
A[i], A[k] = A[k], A[i]
return A
def main():
ss= SelectionSort()
A = [9, 8, 7, 6, 5, 4, 10, 12]
print(ss.sort(A))
if __name__ == '__main__':
main()
4. 氣泡排序
P23思考題2-2。
class BubbleSort:
def sort(self, A):
for i in range(len(A)):
for j in range(0, len(A)-i-1):
if A[j] > A[j+1]:
A[j], A[j+1] = A[j+1], A[j]
return A
def main():
bs = BubbleSort()
A = [9, 8, 7, 6, 5, 4, 10, 12]
print(bs.sort(A))
if __name__ == '__main__':
main()