使用Python實(shí)現(xiàn)七大排序算法的代碼實(shí)例
Python實(shí)現(xiàn)七種常見的排序算法
import random, time # 生成隨機(jī)數(shù)組 def generate_random_array(size, lrange, rrange): return [random.randint(lrange, rrange) for i in range(size)] # 判斷數(shù)組是否順序有序 def is_order_asc(arr): for i in range(len(arr) - 1): if arr[i] > arr[i + 1]: return False return True # 排序算法裝飾器 def sort(name): def decoration(sort_func): def wrapper(*dargs, **dkw): start_time = time.time() sort_func(*dargs, **dkw) if is_order_asc(*dargs): print(name + ':數(shù)組排序所需時(shí)間為:' + str((time.time() - start_time) * 1000) + '毫秒') else: print(name + ':數(shù)組排序失敗') return wrapper return decoration @sort('冒泡排序') def bubble_sort(arr): length = len(arr) for i in range(length - 1): for j in range(length - 1): if arr[j + 1] < arr[j]: arr[j], arr[j + 1] = arr[j + 1], arr[j] @sort('選擇排序') def select_sort(arr): for i in range(len(arr) - 1): min = i for j in range(i + 1,len(arr)): if arr[j] < arr[min]: min = j arr[min], arr[i] = arr[i], arr[min] @sort('插入排序') def insert_sort(arr): for i in range(1, len(arr)): insert_value = arr[i] for j in range(i, -1, -1): if arr[j - 1] <= insert_value: break arr[j] = arr[j - 1] arr[j] = insert_value @sort('希爾排序') def shell_sort(arr): h = 1 while h * 3 + 1 < len(arr): h = h * 3 + 1 while h > 0: for i in range(h, len(arr)): insert_value = arr[i] for j in range(i, -1, -h): if (arr[j - h] <= insert_value): break arr[j] = arr[j - h] arr[j] = insert_value h = int((h - 1) / 3) @sort('統(tǒng)計(jì)排序') def count_sort(arr): min_value = arr[0] max_value = arr[0] for i in range(1, len(arr)): if arr[i] > max_value: max_value = arr[i] elif arr[i] < min_value: min_value = arr[i] else: pass count = [0 for i in range(max_value - min_value + 1)] for i in arr: count[i - min_value] += 1 index = 0 for i in range(len(count)): for j in range(count[i]): arr[index] = i + min_value index += 1 @sort('快速排序') def quick_sort(arr): quick(arr, 0, len(arr) - 1) def quick(arr, start, end): if start >= end: return pivot_index = partition(arr, start, end) quick(arr, start, pivot_index - 1) quick(arr, pivot_index + 1, end) def partition(arr, start, end): pivot = arr[start] mark = start for i in range(start + 1, end + 1): if arr[i] <= pivot: mark += 1 arr[i], arr[mark] = arr[mark], arr[i] arr[start], arr[mark] = arr[mark], arr[start] return mark @sort('歸并排序') def merge_sort(arr): merge_sort2(arr, 0, len(arr) - 1) def merge_sort2(arr, start, end): if start >= end: return middle = int((end - start) / 2) + start merge_sort2(arr, start, middle) merge_sort2(arr, middle + 1, end) merge(arr, start, middle, end) def merge(arr, start, middle, end): copy = [arr[i] for i in range(start, end + 1)] left = start right = middle + 1 index = start while left <= middle and right <= end: if copy[left - start] <= copy[right - start]: arr[index] = copy[left - start] left+=1 else: arr[index] = copy[right - start] right+=1 index+=1 while left <= middle: arr[index] = copy[left - start] left+=1 index+=1 while right <= end: arr[index] = copy[right - start] right+=1 index+=1 if __name__ == '__main__': bubble_sort(generate_random_array(10000, 0, 1000000)) select_sort(generate_random_array(10000, 0, 1000000)) insert_sort(generate_random_array(10000, 0, 1000000)) shell_sort(generate_random_array(10000, 0, 1000000)) count_sort(generate_random_array(10000, 50, 100)) quick_sort(generate_random_array(10000, 0, 1000000)) merge_sort(generate_random_array(10000, 0, 1000000))
最后附上一份 Java
和 Python
執(zhí)行同樣的排序邏輯的消耗時(shí)間對(duì)比。
- 數(shù)據(jù)規(guī)模為
10000
- 時(shí)間單位為毫秒
算法 | java | Python |
冒泡排序 | 179 | 13996 |
選擇排序 | 46 | 3955 |
插入排序 | 15 | 4074 |
希爾排序 | 3 | 63 |
統(tǒng)計(jì)排序 | 1 | 2 |
快速排序 | 3 | 23 |
歸并排序 | 3 | 52 |
到此這篇關(guān)于使用Python實(shí)現(xiàn)七大排序算法的代碼實(shí)例的文章就介紹到這了,更多相關(guān)Python七大排序算法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 實(shí)現(xiàn)上傳圖片并預(yù)覽的3種方法(推薦)
下面小編就為大家?guī)硪黄猵ython 實(shí)現(xiàn)上傳圖片并預(yù)覽的3種方法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-07-07Python NumPy創(chuàng)建數(shù)組方法
這篇文章主要介紹了Python NumPy創(chuàng)建數(shù)組方法,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09關(guān)于PyTorch 自動(dòng)求導(dǎo)機(jī)制詳解
今天小編就為大家分享一篇關(guān)于PyTorch 自動(dòng)求導(dǎo)機(jī)制詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-08-08Python編程學(xué)習(xí)之如何判斷3個(gè)數(shù)的大小
這篇文章主要給大家介紹了關(guān)于Python編程學(xué)習(xí)之如何判斷3個(gè)數(shù)的大小的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08自己編程中遇到的Python錯(cuò)誤和解決方法匯總整理
這篇文章主要介紹了自己編程中遇到的Python錯(cuò)誤和解決方法匯總整理,本文收集整理了較多的案例,需要的朋友可以參考下2015-06-06