常用排序算法python實現

一直捋不清幾個排序,特意花點時間理解一下,有碼有字有動圖,明天補完


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)    

參考:
《數據結構與算法》
動圖來源

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章