排序演算法 氣泡排序 快排 歸併排序

2021-10-08 12:05:31 字數 3170 閱讀 1437

氣泡排序(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...