常用排序算法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)    

参考:
《数据结构与算法》
动图来源

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