氣泡排序(bubble sort)也是一種簡單直觀的排序演算法。它重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。
步驟:比較相鄰的元素。如果第乙個比第二個大,就交換他們兩個。
對每一對相鄰元素作同樣的工作,從開始第一對到結尾的最後一對。這步做完後,最後的元素會是最大的數。
針對所有的元素重複以上的步驟,除了最後乙個。
持續每次對越來越少的元素重複上面的步驟,直到沒有任何一對數字需要比較。
時間複雜度:平均:o(n^2) ,最好情況:當輸入資料正序時,為o(n); 最壞情況:當輸入的資料是反序時,為 o(n^2)
穩定性:因為array[j]==array[j+1]的時候,我們可以不移動array[i]和array[j],所以氣泡排序是穩定的。
def
bubblesort
(arr)
:for i in
range(1
,len
(arr)):
for j in
range(0
,len
(arr)
-i):
if arr[j]
> arr[j+1]
: arr[j]
, arr[j +1]
= arr[j +1]
, arr[j]
return arr
時間複雜度:平均為o(nlogn),最壞情況o(n^2),每次所選的中間數是當前序列中的最大或最小元素;
最好情況:每次劃分所選擇的中間數恰好將當前序列幾乎等分,整個演算法的時間複雜度為o(nlogn)。
最壞情況:每次劃分所選的數都很偏,為陣列的最大值或最小值,此時相當於氣泡排序(每次排好乙個元素的位置),時間複雜度為o(n^2)。解決辦法:選pivot的時候可以隨機選,而不是每次選第乙個或者最後乙個。
挖坑填數的思想
快排就是乙個選定基準點後不斷和基準點比較的過程,比基準大的放到右邊,比基準小的或相等的放到左邊。
1、i =left; j = right;首先選定陣列第乙個數為基準數nums[i],並把它賦值給temp, 相當於挖了乙個坑,把坑中原來的數用temp儲存起來。
2、要先從後往前找。先從後往前找乙個比他小的數nums[j],找到這個數之後將其挖出此數填到之前的坑中nums[i]=nums[j],這時nums[j]又有了乙個坑。再從前往後找比基準數大的,填到剛才挖的坑中,兩種行為交替進行,直到i>=j;這個時候基準temp就找到了它正確的位置 i,所以num[i]=temp;
3、然後進行遞迴,遞迴進行時要求left=right
def
quick_sort
(num, left, right)
:if left
temp = num[left]
print
(num)
print
('left '
, left)
print
('right '
, right)
i = left
j = right
while i
while i
>temp:
j -=
1 num[i]
= num[j]
while i
<=temp:
i +=
1 num[j]
= num[i]
# 基準找到了它正確的位置
num[i]
= temp
# 再對基準的左邊進行排序
quick_sort(num, left, i-1)
# 對基準的右邊進行排序
quick_sort(num, i+
1, right)
if __name__ ==
"__main__"
: num =[4
,1,2
,7,3
,5,4
,8,6
,44,0
,23] quick_sort(num,0,
len(num)-1
)print
(num)
時間複雜度為o(nlogn),最好最壞情況都一樣。空間複雜度為o(n)。
思路:歸併排序的根本思路就是將兩個有序陣列合併為乙個有序陣列。問題的關鍵就是如何將無序陣列分為有序陣列。可以採用遞迴的方式,當一直遞迴到每個陣列中只有乙個數時,這個陣列就相當於排好序了。
def
mergesort
(arr):if
(len
(arr)
<2)
:return arr
# 二分
middle =
len(arr)
//2
left, right = arr[
0:middle]
, arr[middle:
]# 遞迴
return merge(mergesort(left)
, mergesort(right)
)# 合併兩個排好序的陣列
# left,right兩個陣列均已經排好序
defmerge
(left,right)
: result =
while left and right:
if left[0]
<= right[0]
:0))
else:0
))while left:0)
)while right:0)
)return result
arr =[3
,2,5
,8,9
,6,4
,1]temp = mergesort(arr)
print
(temp)
快排 歸併排序
二 歸併排序 遞迴 分治的思維 分治 確定分界點 我們下面以中間值q l r 1 為分界點,理論上任何點作為分界點都可 調整區間 x 的在左邊,x的在右邊 兩個區間 遞迴 遞迴處理左右兩段 原題鏈結 題目描述 給定你乙個長度為n的整數數列。請你使用快速排序對這個數列按照從小到大進行排序。並將排好序的...
排序 冒泡,快排,歸併。
1 冒泡 就是每次相鄰的比較,較大的移到後面,一次後就移動最大的到最後面了。include void maopao int a,int len void main int len sizeof a sizeof a 0 maopao a,len for int x1 0 x12 快速排序,用遞迴來理...
演算法 歸併排序與快排
歸併排序是另一種不同的排序方法,因為歸併排序使用了遞迴分治的思想,所以理解起來比較容易。其基本思想是,先遞迴劃分子問題,然後合併結果。把待排序列看成由兩個有序的子串行,然後合併兩個子串行,然後把子序列看成由兩個有序序列。倒著來看,其實就是先兩兩合併,然後四四合併。最終形成有序序列。空間複雜度為o n...