氣泡排序,快速排序,選擇排序,二分查詢

2021-09-02 01:37:08 字數 2670 閱讀 6607

'''

氣泡排序原理: 每一趟只能將乙個數歸位, 如果有n個數進行排序,只需將n-1個數歸位, 也就是說要進行n-1趟操作(已經歸位的數不用再比較),每一次都是得到比較列表中最大的數。

氣泡排序演算法及其優化

氣泡排序的基本特徵是只能交換相鄰的元素。

從下邊界開始,一趟掃瞄下來,可以把當前最大值頂到上邊界;

如果沒有發生交換操作,則表示陣列是有序的

'''def bubble_sort(seq):

for i in range(len(seq)-1): #每一趟只能將乙個資料歸位,所以需要有 len(seq)-1 次迴圈比較。每一次歸位的數為列表中最大的數。

for j in range(len(seq)-i-1): #每一次迴圈有 len(seq)-i-1 次比較。

if seq[j] > seq[j+1]: #將相鄰的兩個數進行比較

seq[j], seq[j+1] = seq[j+1], seq[j] #把數值小的放前面,數值大的放後面.

return seq

'''優化氣泡排序:

我們可以假設一種場景,比如 8 1 2 3 5 7,進行一次排序之後,結果就變成了 1 2 3 5 7 8,那我們還有必要再像上面**裡那樣繼續迴圈下去嗎?肯定沒有必要了,因為這已經是最終結果了。

那針對上面的**,我們優化的點主要在於:假如某一趟排序之後已經有序,我們需要減少排序的趟數。否則就做了很多無用功。

針對這個問題,我們可以考慮在演算法中加入乙個布林變數,來標識該輪有沒有進行資料的交換,若在某一趟排序中未發現資料位置的交換,則說明待排序的無序區中所有的項均已滿足排序後的結果。那麼就沒有必要再次排序下去了。可以如下改造:

'''def bubble_sort(seq):

for i in range(len(seq)-1): #for i in range(len(seq)-1, 0, -1):

swap_flag = false #設定乙個標識,假設先讓他為false

for j in range(len(seq)-i-1): #for j in range(i):

if seq[j] > seq[j+1]: #如果程式執行以下**,說明資料發生了交換。

seq[j], seq[j+1] = seq[j+1], seq[j]

swap_flag = true

if not swap_flag:

return seq

return seq

'''這樣就優化完了,其實**邏輯很簡單,通過乙個布林變數即可監控一趟過程有沒有進行資料交換。

'''

'''

選擇排序:(每次得到最小值)

選擇排序比較好理解,好像是在一堆大小不一的球中進行選擇(以從小到大,先選最小球為例):

1. 選擇乙個基準球

2. 將基準球和餘下的球進行一一比較,如果比基準球小,則進行交換

3. 第一輪過後獲得最小的球

4. 在挑乙個基準球,執行相同的動作得到次小的球

5. 繼續執行4,直到排序好

'''def selected_sort(seq):

'''選擇排序

:param seq:

:return:

'''swap_flag = false

for i in range(len(seq)-1):

index = i

for j in range(i+1, len(seq)):

if seq[index] > seq[j]:

index = j

seq[i], seq[index] = seq[index], seq[i]

index = i

swap_flag = true

if not swap_flag:

return seq

return seq

'''

快速排序

'''# 使用遞迴

def quick_sort(seq):

if seq == :

return

else:

pivot = seq[0]

lesser = quick_sort([x for x in seq[1:] if x < pivot])

greater = quick_sort([x for x in seq[1:] if x >= pivot])

return lesser + [pivot] + greater

'''

二分查詢法:遞迴方法

'''def binary_chop(alist, data):

n = len(alist)

if n < 1:

return false

mid = n // 2

if alist[mid] > data:

# python 中的切片 alist[0:mid] 從0開始,到mid,但是不包括mid

return binary_chop(alist[0:mid], data)

elif alist[mid] < data:

return binary_chop(alist[mid+1:], data)

else:

return true

氣泡排序,選擇排序,插入排序,快速排序,二分查詢

氣泡排序 相鄰比較 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。選擇排序 找最小...

二分查詢,氣泡排序, 快速排序

class test if start 1 end else mid start intval end start 2 if arr mid x elseif arr mid x elseif arr mid x 氣泡排序 思路 如原始有x個值需要排序 控制最大的值一直往右移動,第一次迴圈必然造成最...

php 氣泡排序 快速排序 二分查詢

氣泡排序 class getnum return arr 快速排序 一般以第乙個元素為準 大於這個元素放左邊 小於這個元素放右邊 class quicknum b arr 0 for i 1 igetquicknum arr left arr right this getquicknum arr r...