使用Python實現(xiàn)七大排序算法的代碼實例
更新時間:2023年07月29日 10:14:46 作者:次時代小羊
這篇文章主要介紹了使用Python實現(xiàn)七大排序算法的代碼實例,所謂排序,就是使一串記錄,按照其中的某個或某些關(guān)鍵字的大小,遞增或遞減的排列起來的操作,需要的朋友可以參考下
Python實現(xiàn)七種常見的排序算法
import random, time
# 生成隨機數(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ù)組排序所需時間為:' + 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)計排序')
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ù)據(jù)規(guī)模為
10000 - 時間單位為毫秒
| 算法 | java | Python |
| 冒泡排序 | 179 | 13996 |
| 選擇排序 | 46 | 3955 |
| 插入排序 | 15 | 4074 |
| 希爾排序 | 3 | 63 |
| 統(tǒng)計排序 | 1 | 2 |
| 快速排序 | 3 | 23 |
| 歸并排序 | 3 | 52 |
到此這篇關(guān)于使用Python實現(xiàn)七大排序算法的代碼實例的文章就介紹到這了,更多相關(guān)Python七大排序算法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 實現(xiàn)上傳圖片并預(yù)覽的3種方法(推薦)
下面小編就為大家?guī)硪黄猵ython 實現(xiàn)上傳圖片并預(yù)覽的3種方法(推薦)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-07-07
Python NumPy創(chuàng)建數(shù)組方法
這篇文章主要介紹了Python NumPy創(chuàng)建數(shù)組方法,文章圍繞主題展開詳細的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下2022-09-09
Python編程學(xué)習(xí)之如何判斷3個數(shù)的大小
這篇文章主要給大家介紹了關(guān)于Python編程學(xué)習(xí)之如何判斷3個數(shù)的大小的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家學(xué)習(xí)或者使用Python具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08

