一直捋不清幾個排序,特意花點時間理解一下,有碼有字有動圖,明天補完
1、插入排序:
不斷將待排序中元素一個一個插入一個有序序列中(一般初始爲待排序序列中的第一個元素,且待排序列表和有序列表其實在一個列表),最終得到有序序列。
如圖:
實現代碼:
def insert_sort(lst):
# 認爲lst中元素第一個已排序
for i in range(1,len(lst)):
# x爲待排序元素
x=lst[i]
# 有序列表元素索引
j = i
# 當前待插入元素與有序列表元素對比大小,若大於其的元素位置整體後移一位,爲其騰出位置
while j>0 and lst[j-1]>x:
# 實現後移
lst[j]=lst[j-1]
# 目標索引位置
j-=1
# 將當前待插入元素插入此時j位置
lst[j]=x
lst=[1,2,5,3,45,23,2]
insert_sort(lst)
print (lst)
#output:[1, 11, 19, 27, 30, 31, 45]
2、選擇排序:
順序遍歷待排序列表,每一趟找到列表剩餘元素最小的值完成排序。
如圖:
實現代碼:
def select_sort(lst):
# 遍歷列表
for i in range(len(lst)):
x=i
# 遍歷剩餘元素
for j in range(x+1,len(lst)):
# 假如剩餘元素列表中有元素小於
if lst[j] < lst[x]:
# 將新最小值索引賦予x變量
x=j
# 交換元素位置
lst[i], lst[x] = lst[x], lst[i]
lst=[1,2,5,3,45,23,2]
select_sort(lst)
print (lst)
3、冒泡排序:
比較兩個元素大小,如果這兩個元素的大小出現逆序,則交換這兩個元素,這樣將較小的元素向前移動,較大的元素向後移動,完成排序。
如圖:
實現代碼:
def bubble_sort(lst):
#遍歷列表
for i in range(len(lst)):
# 此方法將最小或者最大值排到最後,因此內循環遍歷是從1到len(lst)-i
for j in range(1,len(lst)-i):
# 遇到逆序即交換元素位置
if lst[j-1]>lst[j]:
lst[j-1],lst[j]=lst[j],lst[j-1]
lst = [19,2,31,45,6,11,121,27]
bubble_sort(lst)
print(lst)
4、快速排序
首先選取一個基準,將列表元素分爲大於基準和小於基準兩部分,然後遞歸的對兩部分元素進行快排,直到列表全部有序。
如圖:
實現代碼:
def quick_sort(lst):
# 遞歸排序
def qsort(lst,begin,end):
# 遞歸過程中始終保持begin大於end
if begin >= end:
return True
# 基準
a=lst[begin]
# 基準位置索引
i=begin
for j in range(begin+1,end+1):
# 小於基準值時候向右遍歷且當前i位置的值(較大值)與當前較小值交換位置。
if lst[j]<a:
i+=1
lst[i],lst[j]=lst[j],lst[i]
print(lst)
# 較小值移動完畢交換當前基準值與最後一個較小值位置
lst[begin],lst[i]=lst[i],lst[begin]
# 遞歸大數區域小數區域
qsort(lst,begin,i-1)
qsort(lst,i+1,end)
qsort(lst,0,len(lst)-1)
lst = [19,2,31,45,6,11,121,27]
quick_sort(lst)
print("\n")
print(lst)
output:
[19, 2, 31, 45, 6, 11, 121, 27]
[19, 2, 6, 45, 31, 11, 121, 27]
[19, 2, 6, 11, 31, 45, 121, 27]
[11, 2, 6, 19, 31, 45, 121, 27]
[11, 2, 6, 19, 31, 45, 121, 27]
[6, 2, 11, 19, 31, 45, 121, 27]
[2, 6, 11, 19, 31, 27, 121, 45]
[2, 6, 11, 19, 27, 31, 121, 45]
[2, 6, 11, 19, 27, 31, 45, 121]
再掛個簡單易懂的
def quicksort(lst):
if len(lst) < 2:
return lst
else:
result = lst[0]
less = [x for x in lst[1:] if x <= result]
more = [x for x in lst[1:] if x > result]
return quicksort(less)+[result]+quicksort(more)
lst= [6,23,6,7,10,2,54,5]
print(quicksort(lst))
歸併排序
將原列表不斷進行這樣一個過程,對半分割,對子數組分割,直到分無可分,開始歸併,單元素數組歸併並排序成一個雙元素數組,直到將所有元素排序合併。
def merge(left, right):
i, j = 0, 0
result = []
while i < len(left) and j < len(right):
if left[i] <= right[j]:
result.append(left[i])
i+=1
else:
result.append(right[j])
j+=1
result+=left[i:]
result+=right[j:]
return result
def merge_sort(lst):
if len(lst)<=1:
return lst
num=len(lst)/2
left= merge_sort(lst[:num])
right=merge_sort(lst[num:])
return merge(left,right)
lst=[1,6,2,3,2,4,5,3,4]
print merge_sort(lst)
參考:
《數據結構與算法》
動圖來源