氣泡排序 選擇排序 快速排序

2021-09-28 15:14:59 字數 2732 閱讀 4959

氣泡排序的思想在於,不斷地將當前元素與後乙個元素進行比較,如果當前元素較小,則調換當前元素與後乙個元素的位置,否則保持不變;假設需要排序的元素一共有n個,從第乙個元素開始,對後續的(n-2)元素進行上述比較,最終的排序結果中,最後的元素是最大值。

def bubble_sort(alist):

n = len(alist)

for j in range(n-1):

for i in range(n-1-j):

if alist[i] > alist[i+1]:

alist[i],alist[i+1] = alist[i+1],alist[i]

選擇排序是一種簡單直觀的排序演算法,無論什麼資料進去都是 o(n²) 的時間複雜度。所以用到它的時候,資料規模越小越好。唯一的好處可能就是不占用額外的記憶體空間了吧。

演算法步驟

1.首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置

2.再從剩餘未排序元素中繼續尋找最小(大)元素,然後放到已排序序列的末尾。

3.重複第二步,直到所有元素均排序完畢。

def select_sort(alist):

n = len(alist)

for j in range(n-1):

min_index = j

for i in range(j+1, n):

if alist[min_index] > alist[i]:

min_index = i

alist[j], alist[min_index] = alist[min_index], alist[j]

演算法思想

快速排序的核心思想在於:首先在這個序列中隨便找乙個數作為基準數,然後將這個序列中所有比基準數大的數放在該數字的右邊,比基準數小的數放在該數字的左邊。第一輪排序結束之後,再分別對已經好的基準書左邊(比基準數小)和基準書右邊(比基準書大)的數字序列重複上述操作,用遞迴形式即可實現快速排序,完成對整個序列的排序。

演算法步驟

為了清晰地展示快速排序的原理,這裡使用乙個例子來具體說明快速排序演算法排序的過程。

假定現在要對數字序列 [4, 2, 7,8, 0,1, 5,23] 進行快速排序。

我們假設最左邊的編號為i,最左邊的編號為j,不失一般性,假定以4作為基準進行排序(每一次總總是讓j先出發,向左移動,再讓i出發,向右移動)。

(一)第一輪排序

j向左出發尋找第乙個小於4的數,遇到1的時候停下來;i向右出發尋找第乙個大於4的數,遇到7的時候停下來,交換兩者的位置,數字序列變為

[4,2,1,8,0,7,5,23]

接下繼續讓j向左移動,尋找第二個小於4的數,遇到0的時候停下來;讓i向右移動,尋找第二個大於4的數,遇到8的時候停下來,交換兩者的位置,數字序列變為

[4,2,1,0,8,7,5,23]

此時發現i與j相遇了,第一輪排序結束,調換4和0的位置,數字序列變為

[0,2,1,4,8,7,5,23],

所有小於4的數字都在4的左邊,所有大於4的數字都在4的右邊。

(二)第二輪排序

分別對4左邊和4右邊的數字序列進行排序處理,首先對4左邊的數字序列[0,2,1]排序。

以第乙個數字0為基準,j向左出發尋找第乙個小於0的數,i向右出發尋找第乙個大於0的數,遇到0的時候停下來,如果找到就交換兩者的位置,否則不變。數字序列變為[0,2,1],所有小於0的數字都在0的左邊,所有大於0的數字都在0的右邊。

再對4右邊的數字序列[8, 7,5,23]排序。

以第乙個數字8為基準,j向左出發尋找第乙個小於8的數,遇到5的時候停下來;i向右出發尋找第乙個大於8的數,如果找到就交換兩者的位置,同時保證i小於j,那麼數字序列變為[5,7,8,23]。所有小於8的數字都在8的左邊,所有大於8的數字都在8的右邊。

總體數字序列變為[0,2,1,4,5,7,8,23]。

(三)第三輪排序

好了動手算一算,類似第一和第二輪的排序方法,對0右邊的數字序列進行排序,得到[0,1,2];對8左邊的數字序列進行排序,得到[5,7,8,23]。第三輪排序結束。

得到最終的排序結果為

[0,1,2,4,5,7,8,23]。

快排過程結束。

def quick_sort(alist, first, last):

if first >= last:

return

mid_value = alist[first]

low = first

high = last

while low < high:

# high 左移#

while low < high and alist[high] >= mid_value:

high -= 1

alist[low] = alist[high]

while low< high and alist[low] < mid_value:

low += 1

alist[high] = alist[low]

#從迴圈退出時,low == high#

alist[low] = mid_value

#左邊#

quick_sort(alist, first, low-1)

#右邊quick_sort(alist, low+1 , last)

氣泡排序,選擇排序,快速排序

1.氣泡排序 氣泡排序 bubble sort 最為簡單的一種排序,通過重複走完陣列的所有元素,通過打擂台的方式兩個兩個比較,直到沒有數可以交換的時候結束這個數,再到下個數,直到整個陣列排好順序。因乙個個浮出所以叫氣泡排序。雙重迴圈時間o n 2 void bubblesort int arr in...

選擇排序 氣泡排序 快速排序

選擇排序 氣泡排序 快速排序 例子序列 176453 從小到大排序 1.選擇排序 自己的話概括 每個位置上的數字都是由在這個位置之後的所有數字中選擇的乙個最小的數字。1 7 6 4 5 3 1 7 6 4 5 3 1 3 6 4 5 7 1 3 4 6 5 7 1 3 4 5 6 7 完成排序!實現...

氣泡排序 快速排序 選擇排序

原理 臨近的兩個數字比較,按照從小到大或者從大到小進行排序,一共進行n趟排序 n是陣列的長度 時間複雜度 o n 2 test public void bubblesort int length a.length for int j 0 ja i 1 for int i 0 i 時間複雜度 o n ...