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 錯誤就把他們交換過來。走訪元素的工作是重複地進行直到沒有相鄰元素需要交換,也就是說該元素列已經排序完成。穩定性 氣泡排序就是把小的元素往前調或者把大的元素往後調。比較是相鄰的兩個元素比較,交...