python實現排序演算法

2021-10-24 06:26:50 字數 4686 閱讀 2912

2.直接選擇排序,按公升序排

3.希爾排序

4.氣泡排序

5.快速排序

用兩個for迴圈,外面的for迴圈是用來確定待插入有序序列的元素,裡面的for迴圈是用來查詢該元素插入的位置

首先要先找到應該插入的位置,然後將該位置後的元素後移,再將該元素插入到該位置,這樣一次操作之後,該結點前的列表就是乙個有序表了

直到將所有的元素都插入完,那麼就是乙個有序表了

lst1=[15

,26,17

,36,54

,8,3

,12]def

zhijiecharu

(lst)

:for i in

range

(len

(lst)):

enum=lst[i]

for j in

range

(len

(lst[

0:i]))

:if lst[i]

< lst[j]

: lst[j+

1:i+1]

=lst[j:i]

lst[j]

=enum

break

return lst

print

("直接插入排序的結果為:"

,zhijiecharu(lst1)

)

執行結果:

將序列分為待排序和已排序的序列,已排序的序列放在最前面

每一次都會從待排序的序列找到最大/最小值,加入到已排序序列的最後/最前面的位置

def

choice_sort

(lst)

:for i in

range

(len

(lst)):

min1=

min(lst[i:])

ind = lst.index(min1)

lst[i]

,lst[ind]

=min1,lst[i]

return lst

print

("直接選擇排序的結果為:"

,choice_sort(lst)

)

執行結果為:

將序列分組,每次分組的大小為列表長度除2.然後在組內將元素進行直接插入排序

例如:有序列:36 25 48 12 65 25 43 58 76 32

第一次分組並排序後的序列為:

分組(d=5):有5個組,每組的內容為:[36,25],[25,43],[48,58],[12,76],[65,32]

組內直接插入排序後:

25 25 48 12 32 36 43 58 76 65

第二次分組並排序後的序列為:

分組(d=2):有2個組,每組的內容為:[25,48,32,43,76],[25,12,36,58,65]

組內直接插入排序後:

25 12 32 25 43 36 48 58 76 65

第二次分組並排序後的序列為:

分組(d=1):有10個組

組內直接插入排序後:

12 25 25 32 36 43 48 58 65 76

def

shell_sort

(list):

n =len(

list

)# 初始步長

gap = n //

2#每次分組的長度

while gap >0:

for i in

range

(gap, n)

:# 每個步長進行插入排序

temp =

list

[i] j = i

# 插入排序

while j >= gap and

list

[j - gap]

> temp:

list

[j]=

list

[j - gap]

j -= gap

list

[j]= temp

# 得到新的步長

gap = gap //

2return

list

print

("希爾排序後的序列為:"

,shell_sort(lst1)

)

執行結果為:

用兩個for迴圈,最外層的for迴圈,用來控制冒泡的次數,裡面的for迴圈,用來控制每一趟冒泡需要比較的次數。

冒泡的次數應該是陣列長度-1,每一趟比較的次數是冒泡次數-1

假設有陣列:[53,2,6,4,753,23]

第一次冒泡:

用第乙個元素53,去和後面所有的元素進行比較,如果前乙個數比後乙個數大,就進行對換。53>2,將53與2對換、所以第一次冒泡的第一次比較之後陣列為[2,53,6,5,753,23],第二次比較53和6,因為53>6,進行對換[2,6,53,5,753,23]…

直到比較到最後乙個數,此時的陣列為:[2,6,5,53,23,753]

可以看到,冒泡一次之後,陣列中最大的元素就已經到最後乙個了,依次類推,第二次冒泡就將除最後乙個元素之外的最大值放在了倒數第二個

第二次冒泡之後:[2,6,5,23,53,753]

第三次冒泡之後:[2,6,5,23,53,753]

第四次冒泡之後:[2,5,6,23,53,753]

第五次冒泡之後:[2,5,6,23,53,753]

此時已經結束了,因為只需要冒泡n-1次,假設有2個數,則只需要比較1次,就可以得到大小。

def

maopao

(lst)

:for i in

range(0

,len

(lst)-1

):#比較趟數,需要比較n-1,

max=lst[0]

;for j in

range(1

,len

(lst)

-i):

#每趟比較次數,n-1次

ifmax

>lst[j]

: lst[j-1]

,lst[j]

=lst[j]

,lst[j-1]

#進行互換

max= lst[j]

;return lst

執行結果為:

先取左邊第乙個數作為基準值,用兩個指標去記錄元素,從最右邊的指標開始進行比較,如果值比基準值小,就將其值和左邊指標對應的元素進行對換,然後從左邊開始進行比較,將元素值大於基準值的元素和右指標對應的元素進行對調,一直到左右指標之間沒有元素為止,再將基準值放在兩個指標中間,這樣進行一趟比較之後,基準值左邊的都是比基準值小的序列,右邊的都是基準值大的序列

然後對左右序列再進行快排序

def

kuaipai

(list

, left, right)

:if left >= right:

#判斷下標值

return

list

jz =

list

[left]

# 將左邊第一位定位基準數,以此數將序列分為兩部分

min= left #開始進行搜尋

max= right

while left != right:

while left < right :

# 從最右邊開始查,找到第乙個比基準值小的數

iflist

[right]

>= jz:

right -=

1else

:# 從最左邊開始查,查詢比基準值大的數

list

[left]

=list

[right]

left +=

1list

[right]

=list

[left]

list

[right]

= jz

#遞迴呼叫

kuaipai(

list

,min

, left -1)

kuaipai(

list

, left +1,

max)

return

list

lst=

[13451,24

,1234,23

,34,43

,23]print

(kuaipai(lst,0,

len(lst)-1

))

執行結果為:

排序演算法python實現

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

python排序演算法實現

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

Python實現排序演算法

一.氣泡排序 該排序重複地走訪過要排序的元素列,依次比較兩個相鄰的元素,如果順序 如從大到小 首字母從z到a 錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。穩定性 氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交...