'''
氣泡排序原理: 每一趟只能將乙個數歸位, 如果有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...