在Python編程中,列表是常見的數據類型,而對於這種數據類型的排序操作,往往是我們需要重點考慮的問題之一。由於Python擁有極為豐富的標準庫以及第三方庫,我們可以通過選取合適的排序函數,優化Python列表排序效率。
一、內置排序函數
在Python中,內置的sorted()和list.sort()函數都可以用來對列表進行排序。但是這兩者在使用時,會有一些小小的效率差別,這主要是由於Python的解釋器的運行機制不同導致的。
如果我們需要對原列表進行排序,我們可以使用list.sort()函數,它是原地排序,直接在原來的列表上排序。
lst = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
lst.sort()
print(lst) # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
如果我們需要對一個列表進行排序操作,但又不希望直接修改原列表,可以使用sorted()函數。該函數會返回一個新列表,且不會在原列表上進行操作。
lst = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
new_lst = sorted(lst)
print(new_lst) # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
二、NumPy庫的排序函數
NumPy是Python的一種開源科學計算庫,它擁有許多針對數組操作和科學計算的高效的函數。在進行科學計算時,經常需要對大量數據進行排序操作,這時候我們可以選用NumPy中的函數來提高代碼效率。
NumPy中的sort函數非常高效,在排序大量數據時,比Python自帶的排序函數快得多。其排序速度比內置函數快,主要在於sort使用了C語言進行了優化,使得排序效率更高。
import numpy as np
arr = np.array([3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5])
sorted_arr = np.sort(arr)
print(sorted_arr) # [1 1 2 3 3 4 5 5 5 6 9]
三、歸併排序
歸併排序是一種高效的排序算法,它使用分治法(divide and conquer)策略,將原數組拆分成兩個子數組,對每個子數組進行排序,然後將排好序的子數組進行合併。
因為歸併排序使用了分治法的思想,遞歸調用實現分治,適用於大規模數據排序,時間複雜度為O(nlogn),其穩定性也保證了歸併排序的優勢。
def merge(lst1, lst2):
i, j = 0, 0
sorted_lst = []
while i < len(lst1) and j < len(lst2):
if lst1[i] <= lst2[j]:
sorted_lst.append(lst1[i])
i += 1
else:
sorted_lst.append(lst2[j])
j += 1
sorted_lst += lst1[i:]
sorted_lst += lst2[j:]
return sorted_lst
def merge_sort(lst):
if len(lst) <= 1:
return lst
middle = len(lst) // 2
left_lst = lst[:middle]
right_lst = lst[middle:]
left_lst = merge_sort(left_lst)
right_lst = merge_sort(right_lst)
return merge(left_lst, right_lst)
lst = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_lst = merge_sort(lst)
print(sorted_lst) # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
四、快速排序
快速排序也是一種高效的排序算法,它使用分治法,選取一個基準元素,將數組拆分成兩個子數組,然後對每個子數組進行排序,最後將排好序的子數組進行合併,即可得到一個有序數組。
由於快速排序的基本操作是比較和交換,該算法運行速度非常快,時間複雜度也為O(nlogn)。快速排序常被認為是目前最快的排序算法之一。
def partition(lst, low, high):
i = low - 1
pivot = lst[high]
for j in range(low, high):
if lst[j] < pivot:
i += 1
lst[i], lst[j] = lst[j], lst[i]
lst[i+1], lst[high] = lst[high], lst[i+1]
return i + 1
def quick_sort(lst, low, high):
if low < high:
pi = partition(lst, low, high)
quick_sort(lst, low, pi - 1)
quick_sort(lst, pi + 1, high)
return lst
lst = [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5]
sorted_lst = quick_sort(lst, 0, len(lst)-1)
print(sorted_lst) # [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]
五、「TimSort算法」
「TimSort算法」是一種基於歸併排序和插入排序的混合排序算法。在Python中,使用的就是這種排序算法。它最初由Tim Peters於2002年提出,具有較強的適用性,並被廣泛應用於各種編程語言和庫中。
「TimSort算法」實現了一種可變大小的算法,該算法可以根據排序數據的性質調整,並且適用於多個排序任務。其時間複雜度為O(nlogn),具有良好的穩定性和適用性,是目前最為流行的排序算法之一。
六、總結
本文介紹了Python中常用的幾種排序算法以及相應的優化方法。在實際編程中,為了提高代碼運行效率,我們可以根據具體情況選擇合適的算法和庫進行排序操作。一般來說,內置的排序函數和NumPy庫的sort函數可以滿足我們的絕大部分需求,而歸併排序和快速排序在某些特定場景下表現優異。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/280370.html