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