算法学习1:十大排序算法(Python实现)

  • 1.交换排序
  • 1.1冒泡排序
  • 1.2快速排序
  • 2.插入排序
  • 2.1 简单插入排序
  • 2.2 希尔排序
  • 3.选择排序
  • 3.1 简单选择排序
  • 3.2 堆排序
  • 4.归并排序
  • 4.1二路归并排序


注意:写range(a,b)要注意,看左不看右,b-a的值为总个数,从a开始数。如range(0,3),实际的值为0,1,2,总个数为3个。

PS:生成随机数组测试的代码如下

Testlist =random.sample(range(0, 101), 10)
    print('原列表:',Testlist)
    print('升序排序后:',Quick_sort(Testlist))

1.交换排序

1.1冒泡排序

核心思想:双重循环,依次比较相邻的两个元素大小,每次外循环会产生一个最大值在列表末尾。下一次循环这个值不再参加比较,如此下去,直到参加比较的只剩一个值(外循环n-1次)。

def Bubble_Sort(lst):
    n =len(lst)
    for i in range(0,n-1):#外循环,共循环n-1次
        for j in range(0,n-1-i):#内循环。每次内循环量根据i减少
            if lst[j]>lst[j+1]:
                lst[j],lst[j+1]=lst[j+1],lst[j]
    return lst
1.2快速排序

核心思想:取列表开头或结尾一个元素作为中间对比值,遍历余下元素与之比较,划分为一个大数区间和一个小数区间。再对这两个区间再次作此操作,即递归下去,直到所有区间列表都只含一个元素。将所有区间按小——中间值——大拼接起来(这一步应当放在递归过程中,每一次递归的中间值都是不同的),形成升序列表。

def Quick_sort(lst):
    # 递归退出的条件
    length = len(lst)
    if length <= 1:
        return lst
    else:
        mid = lst.pop()#可以选第一个元素作为基准值,也可以选最后一个。这是终止递归的重要一步,它减少了列表内元素个数,到最后参加递归的列表只会剩一个元素。
        big, small = [], []
        for element in lst:
            if element > mid:
                big.append(element)
            else:
                small.append(element)
        return Quick_sort(small) + [mid] + Quick_sort(big)#将划分好的列表再次递归,直到最后划分出的所有列表都只剩一个元素,顺序拼接起来

2.插入排序

2.1 简单插入排序

核心思想:默认从第二个值开始遍历,作为保存值,循环比较保存值左侧的值是否小于它,大于则将该值右移一位,直到保存值左侧的值没有值大于它,此时将保存值插入该位置。如此遍历,完成升序排序。

def Insert_sort(lst):
    n =len(lst)
    for i in range(1,n):
        j =i#采用j的目的是为了后面可以在保持i不变的情况下,循环比较保存值左侧的值
        save =lst[i]
        while lst[j-1]>save and j>0:
            #将所有比保存值大的元素循环右移
            lst[j] =lst[j-1]
            j =j-1
        lst[j] =save#此时循环结束,j-1代表的元素>=save值,j元素值实际已移到了j+1处,故此时将j处元素替换为save值
    return lst
2.2 希尔排序

3.选择排序

3.1 简单选择排序
3.2 堆排序

前置知识:树结构

满二叉树:每一个分支都是满的

python让列表中数字大小排列 python怎么排列数字大小_递归

完全二叉树:最后一行可以不满,但是必须在最后一行的左端

python让列表中数字大小排列 python怎么排列数字大小_递归_02


树结构在程序中采用顺序存储方式,如:

python让列表中数字大小排列 python怎么排列数字大小_递归_03

对于完全二叉树,假设父节点下标为i,那么其左侧子节点下标为2i+1,右侧子节点下标为2i+2。
大根堆:一颗完全二叉树,且父节点永远大于子节点
小根堆:一颗完全二叉树,且父节点永远小于子节点

4.归并排序

4.1二路归并排序