日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python实现五大基本算法_算法基础:五大排序算法Python实战教程

發布時間:2023/12/10 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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实战教程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。