python對常見排序演算法的實現
阿新 • • 發佈:2018-12-28
import random def random_nums_generator(max_value=1000, total_nums=20): """ 隨機數列表生成器 一些常用函式: random隨機數生成 random.random()用於生成一個0到1之間的隨機數:0 <= n < 1.0; random.uniform(a, b),用於生成一個指定範圍內的隨機符點數,兩個引數其中一個是上限,一個是下限。min(a,b) <= n <= max(a,b); random.randint(a, b), 用於生成一個指定範圍內的整數,其中a是下限,b是上限: a<= n <= b; random.randrange(start, stop, step), 從指定範圍內,按指定基數遞增的集合獲取一個隨機數; random.choice(sequence), 從序列中獲取一個隨機元素; random.shuffle(x), 用於將一個列表中的元素打亂; random.sample(sequence, k), 從指定序列中隨機獲取指定長度的片斷; """ num_list = [] for i in range(total_nums): num_list.append(random.randint(0, max_value)) return num_list def bubble_sort(arr): """ 氣泡排序,思想為比較相鄰兩個數,使較大(arr[j] > arr[j+1])或者較小(arr[j] < arr[j+1])的數一直往後推。 時間複雜度O(n^2),空間複雜度O(1) """ L = len(arr) for i in range(L): for j in range(L)[:-i - 1]: if arr[j] > arr[j + 1]: arr[j], arr[j + 1] = arr[j + 1], arr[j] return arr def insert_sort(arr): """ 插入排序,思想為將數插入到適合他大小的位置中。 時間複雜度O(n^2),空間複雜度O(1) """ L = len(arr) ans = [] for i in range(L): for j in range(i + 1): if arr[i] < arr[j]: ans.insert(j, arr[i]) break else: ans.append(arr[i]) break return ans def select_sort(arr): """ 選擇排序,思想為選出最大或最小的數放在首位 時間複雜度O(n^2),空間複雜度O(1) """ L = len(arr) ans = [] for i in range(L): min_num = arr[i] for j in range(i, L): if arr[j] < min_num: min_num = arr[j] ans.append(min_num) return ans def merge_sort(arr): """ 歸併排序,思想為利用遞迴將多個子表合併為一個有序表 時間複雜度O(nlogn),空間複雜度O(1) """ L = len(arr) if L <= 1: return arr middle = L // 2 arr_left = merge_sort(arr[:middle]) arr_right = merge_sort(arr[middle:len(arr)]) new_arr = [] while len(arr_left) and len(arr_right): if arr_right[0] < arr_left[0]: new_arr.append(arr_right.pop(0)) else: new_arr.append(arr_left.pop(0)) new_arr += arr_left new_arr += arr_right return new_arr def quick_sort(arr): """ 快速排序:思想為找一個基準,將小的放在前面,大的放在後面。 時間複雜度:O(nlogn),空間複雜度:O(nlogn) """ L = len(arr) if L <= 1: return arr arr_left = [] arr_right = [] base = arr[0] for i in range(1, L): if arr[i] <= base: arr_left.append(arr[i]) else: arr_right.append(arr[i]) return quick_sort(arr_left) + [base] + quick_sort(arr_right) numarr = random_nums_generator(100, 20) print(numarr) print('bubble_sort:', bubble_sort(numarr)) print('insert_sort:', insert_sort(numarr)) print('select_sort:', select_sort(numarr)) print('merge_sort:', merge_sort(numarr)) print('quick_sort:', quick_sort(numarr))
直接上程式碼了,都挺容易懂得,最好能自己實現一下印象更深刻些。執行結果如下
[57, 61, 94, 82, 81, 11, 22, 73, 75, 50, 81, 54, 92, 73, 95, 15, 50, 35, 6, 45] bubble_sort: [6, 11, 15, 22, 35, 45, 50, 50, 54, 57, 61, 73, 73, 75, 81, 81, 82, 92, 94, 95] insert_sort: [6, 11, 15, 22, 35, 45, 50, 50, 54, 57, 61, 73, 73, 75, 81, 81, 82, 92, 94, 95] select_sort: [6, 11, 15, 22, 35, 45, 50, 50, 54, 57, 61, 73, 73, 75, 81, 81, 82, 92, 94, 95] merge_sort: [6, 11, 15, 22, 35, 45, 50, 50, 54, 57, 61, 73, 73, 75, 81, 81, 82, 92, 94, 95] quick_sort: [6, 11, 15, 22, 35, 45, 50, 50, 54, 57, 61, 73, 73, 75, 81, 81, 82, 92, 94, 95]