talk is cheap, show code
def bubble_sort(arr):
'''
冒泡排序
平均時間複雜度:O(n^2)
最好情況:O(n)
最壞情況:O(n^2)
空間複雜度:O(1)
n次遍歷,每次找出最大放後邊
'''
len_arr = len(arr)
if len_arr < 2:
return arr
for i in range(len_arr):
for j in range(len_arr-1):
if arr[j] >= arr[j+1]:
arr[j], arr[j+1] = arr[j+1], arr[j]
print arr
def selection_sort(arr):
'''
選擇排序
平均時間複雜度:O(n^2)
最好情況:O(n^2)
最壞情況:O(n^2)
空間複雜度:O(1)
n次遍歷,每次遍歷剩餘的數組,從中找出最小的放在前邊
'''
len_arr = len(arr)
if len_arr < 2:
return arr
for i in range(len_arr):
min_ind = i
for j in range(i+1, len_arr):
if arr[j] <= arr[min_ind]:
min_ind = j
arr[i], arr[min_ind] = arr[min_ind], arr[i]
print arr
def insert_sort(arr):
'''
插入排序
平均時間複雜度:O(n^2)
最好情況:O(n)
最壞情況:O(n^2)
空間複雜度:O(1)
n次遍歷,默認前邊的是排好順序的,每次取後邊的插入到前邊合適位置
'''
len_arr = len(arr)
if len_arr < 2:
return arr
for i in range(1, len(arr)):
for j in range(i, 0, -1):
if arr[j] < arr[j-1]:
arr[j], arr[j-1] = arr[j-1], arr[j]
else:
break
print arr
def quick_sort(arr):
'''
快速排序-遞歸版本
平均時間複雜度:O(nlogn)
最好情況:O(nlogn)
最壞情況:O(n^2)
空間複雜度:O(logn)
找一個標誌位,比標誌位大的放右邊,比標誌位小的放左邊,遞歸
'''
len_arr = len(arr)
if len_arr < 2:
return arr
mid = arr[len_arr // 2]
left, right = [], []
arr.remove(mid)
for item in arr:
if item >= mid:
right.append(item)
else:
left.append(item)
return quick_sort(left) + [mid] + quick_sort(right)
def quick_sort_other(arr):
'''
快速排序-非遞歸版本
平均時間複雜度:O(nlogn)
最好情況:O(nlogn)
最壞情況:O(n^2)
空間複雜度:O(logn)
找一個標誌位,比標誌位大的放右邊,比標誌位小的放左邊,遞歸
'''
if len(arr) < 2:
return arr
stack = []
stack.append(len(arr) - 1)
stack.append(0)
while stack:
l = stack.pop()
r = stack.pop()
index = partition(arr, l, r)
if l < index - 1:
stack.append(index - 1)
stack.append(l)
if r > index + 1:
stack.append(r)
stack.append(index + 1)
print arr
def partition(arr, start, end):
pivot = arr[start]
while start < end:
while start < end and arr[end] >= pivot:
end -= 1
arr[start] = arr[end]
while start < end and arr[start] <= pivot:
start += 1
arr[end] = arr[start]
arr[start] = pivot
return start
if __name__ == '__main__':
# arr = [2, 8, 4, 3, 3, 5, 6]
# bubble_sort(arr)
# arr = [2, 8, 4, 3, 3, 5, 6]
# selection_sort(arr)
# arr = [2, 8, 4, 3, 3, 5, 6]
# insert_sort(arr)
# arr = [2, 8, 4, 3, 3, 5, 6]
# print quick_sort(arr)
arr = [5, 8, 4, 3, 3, 5, 6]
quick_sort_other(arr)