【python】经典排序算法及代码实现及动画演示

【python】经典排序算法及代码实现及动画演示

1. 简单插入排序

1)算法原理
2)可视化
3)代码实现

2. 希尔排序

1)算法原理

希尔排序是插入排序的高效实现,对简单插入排序减少移动次数优化而来。

简单插入排序每次插入都要移动大量数据,前后插入时的许多移动都是重复操作,若一步到位移动效率会高很多。

若序列基本有序,简单插入排序不必做很多移动操作,效率很高。

希尔排序将序列按固定间隔划分为多个子序列,在子序列中简单插入排序,先做远距离移动使序列基本有序;逐渐缩小间隔重复操作,最后间隔为1时即简单插入排序。

希尔排序对序列划分O(n)次,每次简单插入排序O(logn),时间复杂度O(nlogn)

额外空间开销出在插入过程数据移动需要的一个暂存,空间复杂度O(1)

2)可视化

https://www.icode9.com/i/ll/?i=20200204161632429.gif

3)代码实现
def ShellSort(ls):
    def shellinsert(arr,d):
        n=len(arr)
        for i in range(d,n):
            j=i-d
            temp=arr[i]             #记录要出入的数
            while(j>=0 and arr[j]>temp):    #从后向前,找打比其小的数的位置
                arr[j+d]=arr[j]                 #向后挪动
                j-=d
            if j!=i-d:
                arr[j+d]=temp
    n=len(ls)
    if n<=1:
        return ls
    d=n//2
    while d>=1:
        shellinsert(ls,d)
        d=d//2
    return ls
 
 
x=input("请输入待排序数列:\n")
y=x.split()
arr=[]
for i in  y:
    arr.append(int(i))
arr=ShellSort(arr)
#print(arr)
print("数列按序排列如下:")
for i in arr:
    print(i,end=' ') 

3. 简单选择排序

1)原理

在要排序的一组数中,选出最小(或者最大)的一个数与第1个位置的数交换;然后在剩下的数当中再找最小(或者最大)的与第2个位置的数交换,依次类推,直到第n-1个元素(倒数第二个数)和第n个元素(最后一个数)比较为止。

2)可视化

【python】经典排序算法及代码实现及动画演示

3)代码实现
###方法一:
arr=[23,41,25,54,18,14]
pos=0
for i in range(len(arr)):
    ls=arr[pos::]
    Max=max(ls)
    tmp=arr.index(Max)
    arr[pos],arr[tmp]=arr[tmp],arr[pos]
    pos+=1
print(arr)

4. 快速排序

1)算法原理
  • 选定Pivot中心轴
  • 将大于Pivot的数字放到Pivot的右边
  • 将小于Pivot的数字放到Pivot的右边
  • 分别对左右子序列重复以上三部,直到序列长度为一的时候完成快排
2)可视化

https://www.bilibili.com/video/BV1at411T75o/?spm_id_from=autoNext

3)代码实现
#######方法一
def QuikSort(arr,L,R):
    l=L
    r=R
    tmp = arr[l]
    if l>=r:
        return arr
    while l<r:
        while l<r and arr[r]>= tmp:
            r-=1
        while arr[r]< tmp:
            arr[l], arr[r] = arr[r], arr[l]
            l+=1
            while arr[l]< tmp:
                l+=1
            while arr[l]> tmp:
                arr[l], arr[r] = arr[r], arr[l]
                r-=1
    QuikSort(arr,L,l-1)
    QuikSort(arr,l+1,len(arr)-1)
    return arr
arr=[6,1,2,7,9,3,4,5,10,8]
res=QuikSort(arr,0,len(arr)-1)
print(res)    
#####方法二
def quick_sort(alist, start, end):
    """快速排序算法的实现"""
 
    # 递归的退出条件
    if start >= end:
        return
    # 设定起始元素为要寻找位置的基准元素
    mid = alist[start]
    # low为序列左边的由左向右移动的游标
    low = start
    # high为序列右边的由右向左移动的游标
    high = end
 
    while low < high:
        # 如果low与high未重合,high指向的元素不比基准元素小,则high向左移动
        while low < high and alist[high] >= mid:
            high -= 1
        # 将high指向的元素放到low的位置上
        alist[low] = alist[high]
 
        # 如果low与high未重合,low指向的元素比基准元素小,则low向右移动
        while low < high and alist[low] < mid:
            low += 1
        # 将low指向的元素放到high的位置上
        alist[high] = alist[low]
 
    # 退出循环后,low与high重合,此时所指位置为基准元素的正确位置
    # 将基准元素放到该位置
    alist[low] = mid
    # 对基准元素左边的子序列进行快速排序
    quick_sort(alist, start, low-1)  # 递归调用!
    # 对基准元素右边的子序列进行快速排序
    quick_sort(alist, low+1, end)  # 递归调用!
 
 
if __name__ == "__main__":
    alist = [54, 26, 93, 17, 77, 31, 44, 55, 20, 100, 77]
    print(alist)
    quick_sort(alist, 0, len(alist)-1)
    print(alist)

5. 冒泡排序

1)算法原理
  • 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
  • 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。
  • 针对所有的元素重复以上的步骤,除了最后一个。
  • 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
    【python】经典排序算法及代码实现及动画演示
2)可视化

https://www.bilibili.com/video/BV1oA411i7HC?from=search&seid=6654424292689255239

3)代码实现
def BubbleSort(ls):
    n=len(ls)
    if n<=1:
        return ls
    for j in range (n,0,-1):
        for i in range(j):
            if ls[i]>ls[i+1]:
                ls[i],ls[i+1] = ls[i+1],ls[i]
    return ls
x=input("请输入待排序数列:\n")
y=x.split()
arr=[]
for i in  y:
    arr.append(int(i))
arr=BubbleSort(arr)
#print(arr)
print("数列按序排列如下:")
for i in arr:
    print(i,end=' ')

6. 堆排序

1)定义

堆排序基于比较交换,是冒泡排序的优化。具体涉及大(小)顶堆的建立与调整。

大顶堆指任意一个父节点都不小于左右两个孩子节点的完全二叉树,根节点最大。

堆排序首先建立大顶堆(找出一个最大值),然后用最后一个叶子结点代替根节点后做大顶堆的调整(再找一个最大值),重复

以数组(列表)实现大顶堆时,从上到下,从左到右编号。父节点序号为n,则左右孩子节点序号分别为2n+1、2n+2

大顶堆的调整:将仅有根节点不满足条件的完全二叉树,调整为大顶堆的过程。

大顶堆调整方法:将根节点与较大一个儿子节点比较,不满足条件则交换。

                        若发生交换,将被交换儿子节点视作根节点重复上一步

大顶堆的建立:从最后一个非叶子节点开始到根节点结束的一系列大顶堆调整过程。

堆排序的初始建堆过程比价复杂,对O(n)级别个非叶子节点进行堆调整操作O(logn),时间复杂度O(nlogn);之后每一次堆调整操作确定一个数的次序,时间复杂度O(nlogn)。合起来时间复杂度O(nlogn)

2)动画演示视频

https://www.bilibili.com/video/av710200011/

3)代码实现
def  HeapSort(ls):
    def heapadjust(arr,start,end):  #将以start为根节点的堆调整为大顶堆
        temp=arr[start]
        son=2*start+1
        while son<=end:
            if son<end and arr[son]<arr[son+1]:  #找出左右孩子节点较大的
                son+=1
            if temp>=arr[son]:       #判断是否为大顶堆
                break
            arr[start]=arr[son]     #子节点上移
            start=son                     #继续向下比较
            son=2*son+1
        arr[start]=temp             #将原堆顶插入正确位置
#######
    n=len(ls)
    if n<=1:
        return ls
    #建立大顶堆
    root=n//2-1    #最后一个非叶节点(完全二叉树中)
    while(root>=0):
        heapadjust(ls,root,n-1)
        root-=1
    #掐掉堆顶后调整堆
    i=n-1
    while(i>=0):
        (ls[0],ls[i])=(ls[i],ls[0])  #将大顶堆堆顶数放到最后
        heapadjust(ls,0,i-1)    #调整剩余数组成的堆
        i-=1
    return ls
#########
x=input("请输入待排序数列:\n")
y=x.split()
arr=[]
for i in  y:
    arr.append(int(i))
arr=HeapSort(arr)
#print(arr)
print("数列按序排列如下:")
for i in arr:
    print(i,end=' ') 

7. 归并排序

1)定义
2)动画演示讲解

https://www.bilibili.com/video/BV1ZW411q7vG?from=search&seid=9791204927634317149

3)代码实现
def MergeSort(array):
    n = len(array)
    if n <= 1:
        return array
    m = n//2
    L = MergeSort(array[:m])
    R = MergeSort(array[m:])

    i,j =0,0
    res=[]
    while i < len(L) and j < len(R):
        if L[i] <= R[j]:
            res.append(L[i])
            i += 1
        else:
            res.append(R[j])
            j += 1

    res += L[i:]
    res += R[j:]
    return res



arr=[23,41,25,54,18,14]
n=len(arr)
ans = MergeSort(arr)
print(ans)

8. 桶排序

1)算法原理
2)可视化
3)代码实现

参考文献:

项目:数据集的大小
测试接口
图像处理方法
python用到的经常库函数
多线程,及用到的库函数
算法:归并排序
数据库查询语句
操作系统
linx 指令
计算机网络;三次握手

上一篇:插入排序


下一篇:排序算法