排序演算法總結 python實現

2021-06-20 14:31:25 字數 3362 閱讀 1293

最近在複習軟考,把看到的排序演算法整理了一下,之所以用python寫,是因為python寫起來簡單....好吧,後來寫的時候發現有些地方用c寫還方便些。python雖然簡潔,但用起來效率感覺還是有些低,不過這不是重點啦。。。

# -*- coding: utf-8 -*-

def bubblesort(data):

'''氣泡排序: 時間複雜度最好o(n),平均o(n*n),最壞o(n*n),輔助空間 o(1),演算法穩定

n個數,每次從第乙個數開始和相鄰的數比較,將大的冒泡到後面去。第一趟將最大的冒泡到最後,

然後第二次只需比較0~n-1,將其中最大的冒泡到n-1,依次下去...總共進行n-1趟排序即可

'''if data:

for i in range(len(data)):

for j in range(len(data)-i-1):

if data[j]>data[j+1]:

data[j],data[j+1]=data[j+1],data[j]

return data

def quicksort(data,low,high):

'''快速排序:o(n*logn),o(n*logn),o(n*n),o(n*logn),不穩定

冒泡的改進,被認為是當前最優秀的內部排序演算法(當然這也不是絕對的,還要看具體情況)。實現基於分治法:分解-解決-合併。

基本思想:

1.從數列中取出乙個基數,

2.將數列中比他大的放在右邊,小的在左邊。

3.兩邊區間重複2,直到各區間只有乙個數。

整個演算法中的基數就是個坑,跳來跳去,總之比他小始終放一邊,大的放另一邊就行

參考:'''

if low < high:

left,right,base=low,high,data[low]

while left =base:

right-=1

if left < right:

data[left]=data[right]

#left+=1 這裡直接+1更快,因為data[left]必然小於base,下次迴圈不用算

#從前往後找比base大的數

while left =0 and data[j] > key:

data[j+1]=data[j]

j-=1

data[j+1]=key

return data

def selectsort(data):

'''選擇排序: 時間複雜度最好o(n*n),平均o(n*n),最壞o(n*n),輔助空間 o(1),演算法不穩定

n個數,每一趟從待排序列l2中選擇最大(或最小)數順序放在已排好序列l1後面(或前面)

總共經過n-1趟可排好,與插入排序相比,都是將資料分為已排和未排序列並將未排元素整理

到已排序列中,不同的是插入排序在未排序列中按序整理,選排則是按大小選擇整理。

'''if data:

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

minnum=i

for j in range(i+1,len(data)):#在l2中尋找最小值

if data[j]1:

gap=n/2

while gap > 0:

for i in range(gap):#按步長插入排序

for j in range(i+gap,n,gap):

if data[j] < data[j-gap]:

key = data[j]

k=j-gap

while k >=0 and data[k] > key:

data[k+gap]=data[k]

k-=gap

data[k+gap]=key

gap/=2

return data

if __name__ =="__main__":

data=[3,5,1,56,3,7,34,21,8]

print data

#insertsort(data)

#bubblesort(data)

#selectsort(data)

#shellsort(data)

quicksort(data,0,len(data)-1)

print data

實際上python列表內建了排序演算法。sort和sorted。

1.內部排序是指待排序列完全存放在記憶體中進行的排序,適合不太大的序列。包括

插入排序(直接插入排序)

快速排序

選擇排序(簡單選擇排序)

氣泡排序

希爾排序

堆排序歸併排序

2.外部排序指能處理大量資料的排序演算法,資料不能一次裝入記憶體,通常要借助外儲存器。常採用排序-歸併策略,比如外歸併排序。詳情參考wiki:外排序 

3.python中沒有自增和自減運算,這在寫**的時候異常不方便。當然咯,這也與python的設計目標有關係。python的設計哲學是優雅,明確、簡單。他們可能認為這樣不太優雅,不利於**的可讀性,譬如js也不推薦使用++和--。另外乙個原因,那就是python不提供像c那樣直接操作記憶體的功能。當執行a+=1時,c會直接修改a在記憶體中的值,而python則會在記憶體中新建乙個整型變數(也不完全這樣,有些小資料python會復用,見下面第4點),然後讓a指向它。所以如果要執行a++,c語言中a還是那個a,而python中的a已經不是原來的a了,這樣就亂套了!

說到這裡,再扯一下python中的可變物件和不可變物件。python中所有物件都是值的引用。不可變指的是值不可變。要修改變數的值就要在記憶體中新建乙個值並讓變數指向它,原來的如果不用就會被gc**。可變物件不需要在其他地方申請記憶體,直接在自己後面申請/釋放空間即可,原位址不變。

4.對於小數值整型物件,比如1~100,python虛擬機器在啟動時會先在記憶體中生成好,放在緩衝區以便於快速呼叫。看下面的例子:

開始a,b為100,a is b是true,說明a,b指向記憶體中同乙個物件,後面值變大了,a=100000時python會在記憶體中新建乙個物件,b=100000也會新建乙個物件,所以a,b指向不同物件,故為false。id(a)是檢視a的位址。

5.有關for迴圈,實質上是乙個遍歷,for i in range(0,10),range()會生成乙個0到9的list讓i遍歷。這樣就有乙個缺陷:i在迴圈前每一步的值是確定的,不能動態改變。而在c語言中,for(int i=n/2,i>0,i=i/2),i是隨著迴圈每次都會改變的。不過事實上,i的值在迴圈前也是可以推算出來的,因此肯定是可以用python的for迴圈代替c的for(int i=n/2,i>0,i=i/2),只不過lz還沒想到,誰知道還麻煩說一聲,哈哈!

排序演算法總結 Python實現 一

整個排序演算法分兩部分來總結,這篇總結第一部分一些相對簡單和常用的排序演算法,包括氣泡排序 選擇排序 插入排序和希爾排序。氣泡排序應該是大家接觸的最早的排序方法了,理解起來也十分簡單。氣泡排序是一種簡單的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果它們的順序錯誤就把它們交換過來。走...

排序演算法python實現

先列出一些演算法複雜度的識別符號號的意思,最常用的是o,表示演算法的上屆,如 2n2 o n2 而且有可能是漸進緊確的,意思是g n 乘上乙個常數係數是可以等於f n 的,就是所謂的a b。而o的區別就是非漸進緊確的,如2n o n2 o n2 確實可以作為2n的上屆,不過比較大,就是所謂的a其他符...

python排序演算法實現

coding utf 8 氣泡排序 氣泡排序演算法的運作如下 比較相鄰的元素。如果第乙個比第二個大 公升序 就交換他們兩個。對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。針對所有的元素重複以上的步驟,除了最後乙個。持續每次對越來越少的元素重複上面的步...