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