四种常见排序算法(快速,冒泡,插入,选择排序)

#插入排序算法
def insert_sort(lst):
    for i in range(1,len(lst)): #开始时片段[0:1]已排序
        # print(i)
        x = lst[i]
        j = i
        while j > 0 and lst[j-1] > x:
            lst[j] = lst[j-1] #反序逐个后移元素,确定插入位置
            j -= 1
        lst[j] = x
    print(lst)

insert_sort([2,3,1,4,5])


#选择排序算法
def select_sort(lst):
    for i in range(len(lst) - 1): #只需要循环len(lst) - 1次
        k = i
        for j in range(i,len(lst)): # k是已知最小元素的位置  这个循环就是把最小元素k找出来
            if lst[j] < lst[k]:
                k = j
        if i != k:             #lst[k] 是确定的最小元素,检查是否需要交换
            lst[i],lst[k] = lst[k],lst[i]
    print(lst)

select_sort([3,2,4,1,5])

#冒泡(交换)排序算法
def bubble_sort(lst):
    for i in range(len(lst)):
        found = False
        for j in range(1,len(lst) - i):
            if lst[j-1] > lst[j]:
                lst[j-1],lst[j] = lst[j],lst[j-1]
                found = True
        if not found:
            break
    print(lst)

bubble_sort([30,13,25,16,47,26,19,10])

#快速排序 20世纪最具影响力的算法之一
def quick_sort(lst):
    qsort_rec(lst,0,len(lst)-1)
    # print(lst)

def qsort_rec(lst,l,r):
    if l >= r:
        return   #分段无记录 或只有一个记录  只有一个数值的时候 下面就不进行了
    i = l
    j = r
    pivot = lst[i]  #是初始空位
    while i < j:    #找pivot的最终位置
        while i < j and lst[j] >= pivot:  #最后一个和第一个进行比较  后面大则 进行下去
            j -= 1                   #用j向左扫描小于pivot的记录
        if i < j:
            lst[i] = lst[j]
            i += 1                  #小记录移动到左边
            print(lst)
        while i < j and lst[i] <= pivot:
            i += 1                     #用i向右扫描找大于pivot的记录
        if i < j:
            lst[j] = lst[i]
            j -= 1                  #大记录移到右边
            print(lst)
    lst[i] = pivot  #将pivot存入其最终位置
    # print(lst)
    qsort_rec(lst,l,i-1)               #递归处理左半区间
    qsort_rec(lst,i+1,r)                #递归处理右半区间

# quick_sort([30,13,25,16,47,26,19,10])
quick_sort([4,3,5,1,2])

 

posted @ 2018-04-07 14:11  Bob__Zhang  阅读(817)  评论(0编辑  收藏  举报