資料結構之內部排序 快速排序

2021-08-17 05:23:25 字數 3736 閱讀 1681

-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...