五種排序演算法 Python語言實現

2021-10-04 22:03:33 字數 3946 閱讀 1514

交換兩項位置方法:

# -*- coding: utf-8 -*-

defswap

(lyst, i, j)

: temp = lyst[i]

lyst[i]

= lyst[j]

lyst[j]

= temp

排序演算法:

選擇排序

defselectionsort

(lyst)

: i =

0while i <

len(lyst)-1

: minindex = i

j = i +

1while j <

len(lyst)

:if lyst[j]

< lyst[minindex]

: minindex = j

j +=

1if minindex != i:

swap(lyst, minindex, i)

i +=

1排序前:[9

,6,7

,11,3

,1,0

,-78,

2,-5

,10,1

]排序後:[-

78,-5

,0,1

,1,2

,3,6

,7,9

,10,11

]氣泡排序

defbubblesort

(lyst)

: n =

len(lyst)

while n >1:

i =1while i < n:

if lyst[i]

< lyst[i -1]

: swap(lyst, i, i -1)

i +=

1 n -=

1排序前:[7

,1,2

,5,0

,-1,

-56,2

,2,2

,1,0

]排序後:[-

56,-1

,0,0

,1,1

,2,2

,2,2

,5,7

]插入排序

definsertionsort

(lyst)

: i =

1while i <

len(lyst)

: itemtoinsert = lyst[i]

j = i -

1while j >=0:

if itemtoinsert < lyst[j]

: lyst[j +1]

= lyst[j]

j -=

1else

:break

lyst[j +1]

= itemtoinsert

i +=

1排序前:[9

,1,5

,10,-

1,13,

5,8,

2,1,

17,4]

排序後:[-

1,1,

1,2,

4,5,

5,8,

9,10,

13,17]

快速排序

defquicksort

(lyst)

: quicksorthelper(lyst,0,

len(lyst -1)

)def

quicksorthelper

(lyst, left, right)

:if left < right:

pivotlocation = partition(lyst, left, right)

quicksorthelper(lyst, left, pivotlocation -1)

quicksorthelper(lyst, pivotlocation +

1, right)

defpartition

(lyst, left, right)

: middle =

(left + right)//2

pivot = lyst[middle]

lyst[middle]

= lyst[right]

lyst[right]

= pivot

boundary = left

for index in

range

(left, right)

:if lyst[index]

< pivot:

swap(lyst, index, boundary)

boundary +=

1 swap(lyst, right, boundary)

return boundary

排序前:[9

,11,5

,1,-

1,113,5,

-8,20

,1,17

,4]排序後:[-

8,-1

,1,1

,4,5

,5,9

,11,17

,20,113

]合併排序

defmergesort

(lyst)

: copybuffer =

for i in

range

(len

(lyst)):

none

) mergesorthelper(lyst, copybuffer,0,

len(lyst)-1

)def

mergesorthelper

(lyst, copybuffer, low, high)

:if low < high:

middle =

(low + high)//2

mergesorthelper(lyst, copybuffer, low, middle)

mergesorthelper(lyst, copybuffer, middle +

1, high)

merge(lyst, low, middle, high)

defmerge

(lyst, low, middle, high)

: i1 = low

i2 = middle +

1for i in

range

(low, high +1)

:if i1 > middle:

copybuffer[i]

= lyst[i2]

i2 +=

1elif i2 > high:

copybuffer[i]

= lyst[i1]

i1 +=

1elif lyst[i1]

< lyst[i2]

: copybuffer[i]

= lyst[i1]

i1 +=

1else

: copybuffer[i]

= lyst[i2]

i2 +=

1for i in

range

(low, high +1)

: lyst[i]

= copybuffer[i]

排序前:[19

,4,51

,10,-

41,113,15,

-84,210,11

,177,4

]排序後:[-

84,-41

,4,4

,10,11

,15,19

,51,113

,177

,210

]

C語言實現七種排序演算法

1 冒泡法 冒泡法大家都較熟悉。其原理為從a 0 開始,依次將其和後面的元素比較,若a 0 a i 則交換它們,一直比較到a n 同理對a 1 a 2 a n 1 處理,即完成排序。下面列出其 冒泡法原理簡單,但其缺點是交換次數多,效率低。下面介紹一種源自冒泡法但更有效率的方法 選擇法 2 選擇法 ...

五種排序演算法 快速排序

1 在陣列中選乙個基準數 通常為陣列第乙個 2 將所有比基準值小的值擺放在基準的前面,所有比基準值大的擺放在基準的後面 相同的數可以放到任意一邊 在這個分割槽推出之後,該基準就處於數列的中間位置。3 遞迴地把 基準值前面的子數列 和 基準值後面的子數列 進行排序。下面以數列a 30,40,10,20...

五種排序演算法 選擇排序

選擇排序 selection sort 是一種簡單直觀的排序演算法。其基本思想是 首先在未排序的數列中查詢到最小或最大元素,然後將其存放到數列到起始位置 接著,再從剩餘未排序的元素中繼續尋找最小或最大的元素,放到以排序序列的末尾。依此類推,直到所有元素排序完畢。以數列為例,演示其選擇排序過程如下圖所...