一、插入排序介紹
插入排序是一種簡單的排序演算法,它的原理是將一個數據插入到已經排好序的有序數據中,將該數據以其實際大小插入到合適的位置。插入排序也包含兩種操作:將一個元素插入到已經排好序的數據中和從未排序的數據中選擇一個元素插入到合適的位置。實現插入排序的關鍵是將元素插入到有序數據中的正確位置。排序過程中,需要使用待排序數據的一個元素去與已經排好序的數據中的元素進行比較,直到找到插入位置,將該元素插入到有序數據中。
二、Python實現插入排序
def insertionSort(arr):
for i in range(1, len(arr)):
val = arr[i]
j = i - 1
while j >= 0 and arr[j] > val:
arr[j+1] = arr[j]
j -= 1
arr[j+1] = val
arr = [64,25,12,22,11]
insertionSort(arr)
print ("排序後的數組:")
for i in range(len(arr)):
print ("%d" %arr[i])
在這個例子中,我們定義了一個插入排序的函數insertionSort()。函數接受一個列表作為參數,對其進行排序,然後返回排序後的列表。插入排序演算法的思路是,從第二個元素開始,將元素插入到前面已經排好序的子列表中。在這個例子中,我們使用了一些Python的語言特性,如列表切片和Python的for循環來進行插入排序。
三、插入排序的優化
雖然插入排序是一種簡單的排序演算法,但是如果列表非常大,它的效率就會降低。原始的插入排序演算法的時間複雜度是O(n^2)。對於大數據量的排序,這非常慢。幸運的是,我們可以通過一些優化來加速插入排序的速度。
一種優化方法是二分查找,在查找插入位置時,可以使用二分查找來找到插入位置,而不是逐個比較。這樣可以把插入的時間從O(n)優化為O(log n)。這樣可以加快插入排序的速度。下面是Python實現的示例代碼:
def binaryInsertionSort(arr):
for i in range(1, len(arr)):
val = arr[i]
j = bisect_left(arr, val, 0, i)
arr[j+1:i+1] = arr[j:i]
arr[j] = val
arr = [64,25,12,22,11]
binaryInsertionSort(arr)
print ("排序後的數組:")
for i in range(len(arr)):
print ("%d" %arr[i])
在這個示例代碼中,我們使用了Python自帶的模塊內置函數 bisect_left()。bisect_left()函數可以返回一個有序的列表中按順序插入一個元素後的正確位置。我們可以使用bisect_left()函數來找到插入位置。
四、總結
插入排序演算法是一種簡單但非常實用的排序演算法。它的原理是將一個元素插入到已經排好序的數據中,然後將該元素以其實際大小插入到合適的位置。雖然插入排序演算法的時間複雜度是O(n^2),但是通過一些優化,我們可以加速插入排序的速度,使它更加實用。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/258304.html