第三課 排序演算法LowB三人組

2021-10-01 08:18:24 字數 3865 閱讀 4345

tags:

categories:

第二節 氣泡排序

第三節 選擇排序

第四節 插入排序

排序:將一組「無序」的記錄序列調整為「有序」的記錄序列

列表排序:將無序列表變為有序列表。

輸入:列表 輸出:有序列表

公升序與降序

內建排序函式: sort()

榜單、紅黑榜、使用**評率等

常見的排序演算法如下

排序lowb三人組

排序nb三人組

其他排序

氣泡排序

快速排序

希爾排序

選擇排序

堆排序計數排序

插入排序

歸併排序

基數排序

列表每兩個相鄰的數,如果前面比後面大,則交換這兩個數。

一趟排序完成後,則無序區減少乙個數,有序區增加乙個數。

**關鍵點:趟、無序區範圍

#!/usr/bin/env python3

# 氣泡排序

defbubble_sort

(li)

:# 整個列表的迴圈是n-1趟

# i=0 第一趟 無需區 len(li)-1

# i=1 第二趟 無需區 len(li)-1-1

# i=n-1 第n-1趟 無需區 len(li)-1-(n-1)

# 第i趟 無序區的長度為len(li)-1-i

for i in

range

(len

(li)-1

):for k in

range

(len

(li)-1

-i):

if li[k]

> li[k+1]

: li[k]

, li[k+1]

= li[k+1]

, li[k]

import random

list

= random.sample(

[i for i in

range

(1000)]

,20)print

(list

) bubble_sort(

list

)print

(list

)

時間複雜度: o(n^2)

如果一趟中列表排序中沒有發生任何交換,我們可以認為列表已經是有序的了

可以加個標誌位

#!/usr/bin/env python3

# 氣泡排序改進

defbubble_sort_impro

(li)

:for i in

range

(len

(li)-1

):exchange =

false

for k in

range

(len

(li)-1

-i):

if li[k]

> li[k+1]

: li[k]

, li[k+1]

= li[k+1]

, li[k]

exchange =

true

ifnot exchange:

return

import random

list1=

[random.randint(0,

1000

)for i in

range(20

)]print

(list1)

bubble_sort_impro(list1)

print

(list1)

每次從列表中選出最小的數放到乙個新列表中

時間複雜度: o(n^2)

#!/usr/bin/env python3

# 簡單版選擇排序

defselect_sort

(li)

: li_new =

for i in

range

(len

(li)):

# 有重複的也沒關係,會從左邊找

# min是0(n) remove是乙個o(n)

min_val =

min(li)

li.remove(min_val)

return li_new

import random

list

= random.sample(

[i for i in

range

(1000)]

,20)print

(list

) li_new = select_sort(

list

)print

(li_new)

上述選擇排序多占用了乙份記憶體。空間複雜度變成2*n。

這不是必要的可以進行改進,避免掉

我把選擇的出的數放在最前面的位置就可以了。最前面的數和選出的數交換

演算法關鍵點:有序區和無序區、無序區最小數的位置

時間複雜度: o(n^2)

#!/usr/bin/env python3

# 改進版選擇排序

defselect_sort_impro

(li)

:for i in

range

(len

(li)-1

):# 假設最小值是無序區的第乙個位置

min_loc = i

# 可以偷次懶 i 不需要和自己比拉

for j in

range

(i+1

,len

(li)):

if li[j]

< li[min_loc]

: min_loc = j

li[i]

, li[min_loc]

= li[min_loc]

, li[i]

import random

list1=

[random.randint(0,

1000

)for i in

range(20

)]print

(list1)

select_sort_impro(list1)

print

(list1)

初始時手裡(有序區)只有- -張牌

每次(從無序區)摸一-張牌,插入到手裡已有牌的正確位置

#!/usr/bin/env python3

# 插入排序

definsert_sort

(li)

:for i in

range(1

,len

(li)):

# i表示摸到的牌

temp = li[i]

j = i -

1# j表示有序區的最後一張牌(手裡的牌)

while j >=

0and li[j]

> temp:

li[j +1]

= li[j]

j -=

1 li[j +1]

= temp

import random

list

= random.sample(

[i for i in

range

(1000)]

,20)print

(list

) insert_sort(

list

)

排序演算法之low B三人組

列表排序 將無序列表變成有充列表 應用場景 各種榜單,各種 給二分法排序使用,給其他演算法使用 輸入無序列表,輸出有序列表 公升序或降序 排序low b三人組 首先,列表每兩個相鄰的數做比較,如果前邊的數比後邊的數大,那麼交換這兩個數 def bubble sort l1 for i in rang...

演算法3(low B三人組)

首先,列表每兩個相鄰的數,如果前邊的比後邊的大,那麼交換這兩個數 時間複雜度 o n2 def bubble sort lis 氣泡排序 param lis 無序列表 return 有序的從小到大的列表 for i in range 0,len lis 1 可能存在列表已經排好的情況,加標記 exc...

第三課 選擇排序

quote 筆記 選擇排序 quote b 1.選擇排序類 b package com.flysnow.chap03 選擇排序 author 飛雪無情 since 2010 3 25 public class arraysel 插入元素 param value public void insert ...