-ide:pycharm
-python版本:python3.x
-演算法分類:內部排序->交換類排序->快速排序
待排序記錄序列中選取乙個記錄為樞軸,其關鍵字為k1
k
1,然後將其餘關鍵字小於k1
k
1的移到前面,大於k1
k
1的移到後面,結果是待排序記錄分為兩個子表,最後將關鍵字k1
k
1插到中間處。這個過程稱為一趟快速排序。對分割後的序列,按上述規則繼續劃分直到所有子表長度不大於
1 1
,此時待排序記錄成為乙個有序表。
分析快速排序的時間耗費,共需要進行多少趟排序,取決於遞迴深度。
1.快速排序的最好情況是每一趟排序都將序列一分為二,正好在表中間,將表分為大小相等的子表,類似於折半查詢,其時間複雜度約為o(
nlog
2n)' role="presentation">o(n
log2
n)o(
nlog
2n)2.快速排序的最壞情況是已經排好序,第一趟經過n−
1 n−1
次比較,第乙個記錄停在原地,產生的左邊的列表長度為
0 0
,右邊的列表長度為n−
1' role="presentation">n−1
n−1,這樣下來比較的次數為∑n
−1i=
1(n−
i)=(
n−1)
+(n−
2)+.
..+1
=n(n
−1)2
≈n22
∑ i=
1n−1
(n−i
)=(n
−1)+
(n−2
)+..
.+1=
n(n−
1)2≈
n2
2快速排序所需的時間平均值為ta
vg(n
)=kn
log2
n tav
g(n)
=knl
og2n
,其中k為某個常數。
3.快速排序遞迴演算法的執行過程對應一顆而叉樹,理想狀態下是一顆完全二叉樹,遞迴工作站的大小,與此二叉樹的深度對應,平均情況下空間複雜度為o(
log2
n)o (l
og2n
)。
排序演算法
穩定性時間複雜度
最好情況
最壞情況
空間複雜度
快速排序
不穩定o(n
log2n)o
(nlo
g2n)
o(nlog
2n) o(n
log2
n)
o(n2
) o(n
2)
o(log2n)o
(log
2n
)
# !/usr/bin/python3
# _*_ coding:utf-8 _*_
# 快速排序
import sys, random, time # 匯入包
defmake_numbers
(number, maxnumber):
# 用於生成列表的演算法。
lista =
for i in range(number):
print(lista)
return lista # 返回列表
defquick_sort
(lista, low, high):
# 進行快速排序的演算法。
global pos # 設定全域性變數,因為我這裡是把一次排序的演算法寫到另乙個方法裡的。
if low < high: # 判斷是否相交。
pos = quick_pass(lista, low, high) # 一次排序。
quick_sort(lista, low, pos-1) # 左子樹。遞迴呼叫。
quick_sort(lista, pos+1, high) # 右子數。
return lista # 返回排好的list
defquick_pass
(lista, low, high):
# 一次快速排序演算法。
pivot = lista[low] # 記錄低點的值
while low < high: # 判斷是否相交
while low < high and lista[high] >= pivot: # 在沒有相交的情況下,從右向左尋找大於低點的值的數。
high = high-1
# 高位減一。向前走一位。
if low < high: # 如果高低位沒有相交,
lista[low] = lista[high] # 沒啥意思。就是給個值。
low = low + 1
# 低位向前1位。
while low < high and lista[low] < pivot: # 同理,尋找小於低點的值。
low = low + 1
if low < high:
lista[high] = lista[low]
high = high - 1
lista[low] = pivot # 最後,將低點的值放到low點,或者high點。(此地low = high)
return low
if __name__ == '__main__':
helpinfo = '''
this program is for quick sort.
how to use it! follow the example!
python quick_sort.py 10 100
the 10 representative will generate ten numbers.
100 representative the max-number you make.
'''command = sys.argv[0:] # 從鍵盤獲取輸入。
if len(command) != 3
or'help'
in command: # 對輸入的引數進行檢查。
print(helpinfo) # 列印幫助文字
else:
try: # 嘗試將輸入測引數轉化為int型。
number = int(command[1])
maxnumber = int(command[2])
except valueerror: # 轉化失敗,出現valueerror
print(helpinfo) # 列印幫助文字。
sys.exit(1) # 異常退出
lista = make_numbers(number, maxnumber) # 一切正常, 生成列表lista。
timestart = time.time() # 記錄開始時間
list = quick_sort(lista, 0, number-1) # 接收返回的排序好的list
timeend = time.time() # 記錄結束時間。
timeis = timeend - timestart # 記錄消耗時間。
print('排序%d個數花費的時間是%f' % (number, timeis)) # 輸出訊息資訊。
print(list)
資料結構之內部排序個人總結
內部排序簡單來說,就是在記憶體中存放待排序資料元素進行排序的過程。內部排序簡單分為 插入排序,快速排序,選擇排序,歸併排序,基數排序。一 插入排序 時間效率 o n2 空間效率 n 1 演算法穩定,鍊錶結構效率更高。時間效率 o n2 空間效率 n 1 演算法穩定,鍊錶結構無法進行 折半 如圖 3 ...
資料結構之內部排序演算法總結筆記
內部排序演算法 排序的基本概念 把一組無序的資料元素按照關鍵字值遞增 或遞減 的順序重新排列。一 插入排序 思想 將序列分為 有序段 與 無序段 兩段,然後依次將 無序段 中的元素插入到 有序段 的正確位置。尋找元素應插入的位置可用 直接 和 折半 兩種方式進行查詢。對應演算法 直接插入排序 折半插...
資料結構 內部排序
內部排序演算法 時間複雜度 o n 2 o n 2 o n 2 空間複雜度 o 1 o 1 o 1 演算法名稱 插入 選擇 冒泡 演算法名稱 希爾 堆 快速 歸併 基數 空間複雜度 o 1 o 1 o logn o n o 2rd 時間複雜度 o nlogn o nlogn o nlogn o nl...