排序是比較常見的演算法了,針對實際資料的特點擊擇合適的排序演算法可以使程式獲得更高的效率,今天來總結一下用python來實現各種排序。
氣泡排序是一種很簡單的排序了,名字也很形象
思想:相鄰節點進行兩兩比較,如果左邊的比右邊的大就交換兩個元素的位置,第一輪排序結束後,最大的元素跑到了最右面;接下來對沒排好序的n-1個元素再進行排序,這樣,每次排序都有乙個最大的往後面冒
時間複雜度:o(n2),假設排序的數有n個,遍歷一趟的複雜度是o(n),需要遍歷n-1趟,所以是o(n2)
空間複雜度:o(1),因為不需要額外的儲存空間
穩定性:穩定,因為相鄰兩個元素之間交換,沒有改變元素的相對位置,滿足穩定性
實現:
def
bubble_sort
(alist)
: n =
len(alist)
for i in
range(0
, n -1)
:for j in
range(0
, n - i -1)
:if alist[j]
> alist[j +1]
: alist[j]
, alist[j +1]
= alist[j +1]
, alist[j]
if __name__ ==
"__main__"
: li =[54
,26,93
,17,77
,31,44
,55,20
]print
(li)
bubble_sort(li)
print
(li)
思想:首先在未排序的序列中找出最小元素,放在排序序列的起始位置
然後繼續在未排序序列中選擇最小的,將其放在已排序序列的末尾
以此類推,直到所有元素都排好序
時間複雜度:o(n2),因為每次遍歷的複雜度是o(n),一共遍歷n-1次,所以複雜度是o(n2)
空間複雜度:o(1)
穩定性:穩定,因為無論什麼資料進去都是o(n2)的時間複雜度,所以用到它的時候,資料規模越小越好
實現:
def
selectsort
(lst)
: n=
len(lst)
if n<=1:
return lst
for i in
range(0
,n-1):
minindex=i
for j in
range
(i+1
,n):
#比較一遍,記錄索引不交換
if lst[j]
: minindex=j
if minindex!=i:
#按索引交換
(lst[minindex]
,lst[i])=
(lst[i]
,lst[minindex]
)return lst
if __name__ ==
"__main__"
: li =[54
,26,93
,17,77
,31,44
,55,20
]print
(li)
selectsort(li)
print
(li)
思想:在數列中選擇乙個基準,所有比基準小的元素放在基準前面,所有比基準大的元素放在基準後面,然後遞迴的把左邊和右邊的子串行再進行此方法的排序。
快速排序之所以比較快,是因為與氣泡排序相比,每次的交換是跳躍式的,不會像氣泡排序一樣每次只能在相鄰的數之間進行交換,交換的距離大了,所以總的交換次數就少了,速度就提高了。
時間複雜度:在最壞的情況下,仍然可能是相鄰的兩個數進行交換,所以最差時間複雜度和氣泡排序一樣是o(n2),平均時間複雜度是o(nlog2n)
實現:
def
quick_sort
(alist, start, end)
:if start >= end:
# 遞迴的退出條件
return
key = alist[start]
# 設定起始的基準元素
low = start # low為序列左邊在開始位置的由左向右移動的游標
high = end # high為序列右邊末尾位置的由右向左移動的游標
while low < high:
# 如果low與high未重合,high(右邊)指向的元素大於等於基準元素,則high向左移動
while low < high and alist[high]
>= key:
high -=
1 alist[low]
= alist[high]
# 走到此位置時high指向乙個比基準元素小的元素,將high指向的元素放到low的位置上,此時high指向的位置空著,接下來移動low找到符合條件的元素放在此處
# 如果low與high未重合,low指向的元素比基準元素小,則low向右移動
while low < high and alist[low]
< key:
low +=
1 alist[high]
= alist[low]
# 此時low指向乙個比基準元素大的元素,將low指向的元素放到high空著的位置上,此時low指向的位置空著,之後進行下一次迴圈,將high找到符合條件的元素填到此處
# 退出迴圈後,low與high重合,此時所指位置為基準元素的正確位置,左邊的元素都比基準元素小,右邊的元素都比基準元素大
alist[low]
= key # 將基準元素放到該位置
# 對基準元素左邊的子串行進行快速排序
quick_sort(alist, start, low -
1# 對基準元素右邊的子串行進行快速排序
quick_sort(alist, low +
1, end)
if __name__ ==
'__main__'
: alist =[54
,26,93
,17,77
,31,44
,55,20
] quick_sort(alist,0,
len(alist)-1
)print
(alist)
思想:從第乙個元素開始,該元素可以認為已經被排序,取出下乙個元素,在已排序的元素序列中從後向前掃瞄,如果該元素(已排序)大於新元素,將該元素往後挪乙個。插入排序在實現上,在從後向前掃瞄過程中,需要反覆把已排序元素逐步向後挪位,為最新元素騰位置。
實現:
def
insert_sort
(list):
for i in
range(1
,len
(list))
:#外層迴圈
for j in
range
(i,0,-
1):#內層迴圈決定試探位置
iflist
[j]<
list
[j-1]:
list
[j],
list
[j-1]=
list
[j-1],
list
[j]else
:break
list=[
1,4,
5,2,
1,9,
7,4,
3,1,
6]insert_sort(
list
)print
(list
)
python實現快排 氣泡排序
1 快排 快排 從一堆雜亂的資料中挑選乙個基準值,將這些數字和基準值一一比較,大的放基準值的右邊,小的放左邊 實現思路 定義乙個函式,挑選列表的首個數字作為基準值,其他數字比基準值小的數字生成列表,同理,其他數字和基準值大的數字生成另乙個列表,再遞迴快排這兩個列表 def quick sort nu...
排序 選擇 冒泡 快排
簡單介紹三種常見的排序方法 選擇 冒泡 快排。從大到小排列 選擇排序是在所有資料中先選擇第乙個資料作為最大值,依次和後面的每乙個資料比較,如果比最大值大,替換最大值並且記住索引,遍歷結束後,通過索引把最大值和第乙個資料替換。後面的資料依次執行一遍,就可以得到從大到小排列的資料了。如下 4 void ...
python實現冒泡選擇插入快排
通過交換使相鄰的兩個數變成小數在前大數在後,這樣每次遍歷後,最大的數就 沉 到最後面了。重複n次即可以使陣列有序。def butttle arr for i in range len arr 1 exchange false for j in range len arr i 1 if arr j a...