python实现五大基本算法_算法基础:五大排序算法Python实战教程
排序是每個算法工程師和開發者都需要一些知識的技能。 不僅要通過編碼實現,還要對編程本身有一般性的了解。 不同的排序算法是算法設計如何在程序復雜性,速度和效率方面具有如此強大影響的完美展示。
讓我們來看看前6種排序算法,看看我們如何在Python中實現它們!
一、冒泡排序
冒泡排序是數據分析中常用的算法,因為它清楚地演示了排序的工作原理,同時簡單易懂。 冒泡排序逐步遍歷列表并比較相鄰的元素對。 如果元素的順序錯誤,則會交換元素。 重復遍歷列表的未排序部分,直到列表被排序。 因為冒泡排序重復通過列表中未排序的部分,所以它具有最差的O(n2)復雜度。
def bubble_sort(arr):
def swap(i, j):
arr[i], arr[j] = arr[j], arr[i]
n = len(arr)
swapped = True
x = -1
while swapped:
swapped = False
x = x + 1
for i in range(1, n-x):
if arr[i - 1] > arr[i]:
swap(i - 1, i)
swapped = True
return arr
二、選擇排序
選擇排序也很簡單,但通常優于冒泡排序。如果您在兩者之間進行選擇,最好默認選擇排序。 使用Selection排序,我們將輸入列表/數組分為兩部分:已排序的項目子列表和剩余要排序的項目子列表構成列表的其余部分。 我們首先找到未排序子列表中的最小元素,并將其放在已排序子列表的末尾。 因此我們不斷抓取最小的未排序元素,并將其按排序子列表中的排序順序放置。 該過程以迭代方式繼續,直到列表完全排序。
def selection_sort(arr):
for i in range(len(arr)):
minimum = i
for j in range(i + 1, len(arr)):
# Select the smallest value
if arr[j] < arr[minimum]:
minimum = j
# Place it at the front of the
# sorted end of the array
arr[minimum], arr[i] = arr[i], arr[minimum]
return arr
三、插入排序
與冒泡排序和選擇排序相比,插入排序更快且可以說更簡單。 有趣的是這是有多少人在玩紙牌游戲時對卡片進行排序! 在每次循環迭代中,插入排序從數組中刪除一個元素。 然后它會在另一個已排序的數組中找到該元素所屬的位置,并將其插入其中。 它重復此過程,直到沒有輸入元素。
def insertion_sort(arr, simulation=False):
for i in range(len(arr)):
cursor = arr[i]
pos = i
while pos > 0 and arr[pos - 1] > cursor:
# Swap the number down the list
arr[pos] = arr[pos - 1]
pos = pos - 1
# Break and do the final swap
arr[pos] = cursor
return arr
四、合并排序
合并排序是Divide and Conquer算法的完美典范。 它簡單地使用了這種算法的2個主要步驟:
(1)連續劃分未排序列表,直到有N個子列表,其中每個子列表有1個“未排序”元素,N是原始數組中元素的數量。
(2)反復合并,即一次比較2個子列表,以產生新的排序子列表,直到所有元素完全合并為單個排序數組。
def merge_sort(arr):
# The last array split
if len(arr) <= 1:
return arr
mid = len(arr) // 2
# Perform merge_sort recursively on both halves
left, right = merge_sort(arr[:mid]), merge_sort(arr[mid:])
# Merge each side together
return merge(left, right, arr.copy())
def merge(left, right, merged):
left_cursor, right_cursor = 0, 0
while left_cursor < len(left) and right_cursor < len(right):
# Sort each one and place into the result
if left[left_cursor] <= right[right_cursor]:
merged[left_cursor+right_cursor]=left[left_cursor]
left_cursor += 1
else:
merged[left_cursor + right_cursor] = right[right_cursor]
right_cursor += 1
for left_cursor in range(left_cursor, len(left)):
merged[left_cursor + right_cursor] = left[left_cursor]
for right_cursor in range(right_cursor, len(right)):
merged[left_cursor + right_cursor] = right[right_cursor]
return merged
五、快速排序
快速排序也是一種分而治之的算法。 雖然它有點復雜,但在大多數標準實現中,它的執行速度明顯快于合并排序,很少達到O(n2)的最壞情況復雜度。 它有3個主要步驟:
(1)我們首先從數組中選擇一個數據作為基準數。
(2)將小于基準數的所有元素移動到基準數的左側; 將所有大于基準數的元素移動到基準數的右側。 這稱為分區操作。
(3)遞歸地將上述兩個步驟分別應用于每個元素子陣列,直到其值小于和大于最后一個基準數。
def partition(array, begin, end):
pivot_idx = begin
for i in xrange(begin+1, end+1):
if array[i] <= array[begin]:
pivot_idx += 1
array[i], array[pivot_idx] = array[pivot_idx], array[i]
array[pivot_idx], array[begin] = array[begin], array[pivot_idx]
return pivot_idx
def quick_sort_recursion(array, begin, end):
if begin >= end:
return
pivot_idx = partition(array, begin, end)
quick_sort_recursion(array, begin, pivot_idx-1)
quick_sort_recursion(array, pivot_idx+1, end)
def quick_sort(array, begin=0, end=None):
if end is None:
end = len(array) - 1
return quick_sort_recursion(array, begin, end)
微信公眾號:python練手項目實戰
更多機器學習算法的學習歡迎關注我們。對機器學習感興趣的同學歡迎大家轉發&轉載公眾號文章,讓更多學習機器學習的伙伴加入公眾號《python練手項目實戰》,在實戰中成長。同時歡迎在公眾號內留言;
總結
以上是生活随笔為你收集整理的python实现五大基本算法_算法基础:五大排序算法Python实战教程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 6月7日开始!今年我国高考报名1193万
- 下一篇: 申通员工因踩踏传送带被罚1万 传送带“吃