**:
**:常用的排序演算法:氣泡排序,插入排序,歸併排序, 快速排序、基數排序、堆排序,直接選擇排序。
常用的查詢演算法:順序查詢,二分查詢,雜湊表查詢和二叉樹查詢
其中我們應該重點掌握二分查詢、歸併排序和快速排序,保證能隨時正確、完整地寫出它們的**。同時對其他的查詢和排序必須能準確說出它們的特點、對其平均時間複雜度、最差時間複雜度、額外空間消耗和穩定性爛熟於胸.
排序演算法的穩定性:假設在待排序的記錄序列中,存在多個具有相同關鍵字的記錄,若經過排序,這些記錄的相對次序保持不變。即在原序列中r[i]=r[j] r[i]=r[j]r[i]=r[j], 且r[i] r[i]r[i]在r[j] r[j]r[j]之前,而在排序後的序列中,r[i] r[i]r[i]仍在r[j] r[j]r[j]之前,則稱這種排序演算法是穩定的;否則是不穩定的
演算法效能總覽
備註:在pascal中比較容易理解,容易計算的方法是:看看有幾重for迴圈,只有一重則時間複雜度為o(n),二重則為o(n^2),依此類推,如果有二分則為o(logn),二分例如快速冪、二分查詢,如果乙個for迴圈套乙個二分,那麼時間複雜度則為o(nlogn)。
氣泡排序
演算法描述:
1. 比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。
2. 對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
3. 針對所有的元素重複以上的步驟,除了最後乙個
4. 持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較
插入排序def insert_sort2(ilist):for i in range(len(ilist)):
for j in range(i):
if ilist[i] < ilist[j]:
ilist.insert(j, ilist.pop(i))
break
return ilist
list=[4,6,2,8,3,7]歸併排序 快速排序print insert_sort(list)
list=[6,5,9,8,7,6]
print insert_sort(list)
快速排序(quicksort),在平均狀況下,排序 n n 個專案要 o(nlogn) o(nlogn))次比較。在最壞狀況下則需要 o(n 2 ) o(n2))}次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 o(nlogn) o(nlogn) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出
演算法描述:
快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)
1. 從數列中挑出乙個元素,稱為」基準」(pivot)
2. 重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(相同的數可以到任何一邊)。在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作
3. 遞迴地(recursively)把小於基準值元素的子數列和大於基準值元素的子數列排序
#5、歸併排序coding=utf-8
'''快速排序(quicksort),在平均狀況下,排序 n n 個專案要 o(nlogn) o(nlogn))次比較。在最壞狀況下則需要 o(n 2 ) o(n2))}次比較,但這種狀況並不常見。事實上,快速排序通常明顯比其他 o(nlogn) o(nlogn) 演算法更快,因為它的內部迴圈(inner loop)可以在大部分的架構上很有效率地被實現出
演算法描述:
快速排序使用分治法(divide and conquer)策略來把乙個序列(list)分為兩個子串行(sub-lists)
1. 從數列中挑出乙個元素,稱為」基準」(pivot)
2. 重新排序數列,所有比基準值小的元素擺放在基準前面,所有比基準值大的元素擺在基準後面(相同的數可以到任何一邊)。在這個分割槽結束之後,該基準就處於數列的中間位置。這個稱為分割槽(partition)操作
3. 遞迴地(recursively)把小於基準值元素的子數列和大於基準值元素的子數列排序
---------------------
原文:
'''def
quick_sort(list):
if list==:
return
else
: qfirst=list[0]
qless = quick_sort([l for l in list[1:] if l
qmore = quick_sort([m for m in list[1:] if m >qfirst])
return qless+[qfirst]+qmore
defquick_sort2(array, l, r):
if l
q =partition(array, l, r)
quick_sort2(array, l, q - 1)
quick_sort2(array, q + 1, r)
defpartition(array, l, r):
x =array[r]
i = l - 1
for j in
range(l, r):
if array[j] <=x:
i += 1array[i], array[j] =array[j], array[i]
array[i + 1], array[r] = array[r], array[i+1]
return i + 1list=[4,6,2,8,3,7]
print quick_sort2(list,0,5)
#coding=utf-8
'''歸併排序(mergesort),是建立在歸併操作上的一種有效的排序演算法,效率為 o(nlogn) o(nlogn)。2023年由約翰·馮·諾伊曼首次提出。該演算法是採用分治法(divide and conquer)的乙個非常典型的應用,且各層分治遞迴可以同時進行
演算法描述
迭代法
1. 申請空間,使其大小為兩個已經排序序列之和,該空間用來存放合併後的序列
2. 設定兩個指標,最初位置分別為兩個已經排序序列的起始位置
3. 比較兩個指標所指向的元素,選擇相對小的元素放入到合併空間,並移動指標到下一位置
4. 重複步驟3直到某一指標到達序列尾
5. 將另一串行剩下的所有元素直接複製到合併序列尾
遞迴法
1. 將序列每相鄰兩個數字進行歸併操作,形成 ceil(n/2) ceil(n/2) 個序列,排序後每個序列包含兩/乙個元素
2. 若此時序列數不是1個則將上述序列再次歸併,形成 ceil(n/4) ceil(n/4) 個序列,每個序列包含四/三個元素
3. 重複步驟2,直到所有元素排序完畢,即序列數為1
---------------------
原文:
'''def
mergesort(arr):
import
math
if(len(arr)<2):
return
arr
#middle = math.floor(len(arr)/2)
middle = len(arr)/2left, right =arr[0:middle], arr[middle:]
return
merge(mergesort(left), mergesort(right))
defmerge(left,right):
result =
while left and
right:
if left[0] <=right[0]:
else
:
while
left:
while
right:
return
result
list=[4,6,2,8,3,7]
mergesort(list)
list=[6,5,9,8,7,6]
print mergesort(list)
python常見排序演算法 python常用排序演算法
def bubble sort alist 氣泡排序 n len alist for i in range n 1 外層迴圈次數 for j in range n 1 i 這裡 記得要 i if alist j alist j 1 alist j alist j 1 alist j 1 alist ...
python實現常用排序演算法
半夜醒來,閒來無事,寫寫排序演算法,興之所致,未來得及debug,有問題自己解決。coding utf 8 created on tue may 19 00 52 47 2015 氣泡排序 插入排序 1 每一步就像在一首已經排序的撲克牌中再插入一張牌,這張牌標記為value 2 從最後一張開始比較,...
常用排序基礎演算法 python
基本思想 兩個數比較大小,較大的數下沉,較小的數冒起來。過程 平均時間複雜度 o n2 引用from random import randint defbubble sort arr,order true 氣泡排序演算法 param arr 需要排序的陣列 param order 排序方向預設為tr...