排序算法【汇总】含代码

2023.12.18, 记于公司摸鱼时刻


一、选择排序

1. 算法思路

首先从无序数组中找到最小元素,放到数组最前面,再从剩下的无序元素中找到最小元素放到前一个排好的元素后面。
算法步骤:
1) 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。
2) 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
3) 重复第二步,直到所有元素均排序完毕。

2. 实现代码

def selectionsort(arr):
    for i in range(len(arr)-1):
        minIndex = i
        for j in range(i+1, len(arr)):
            if arr[j] < arr[minIndex]:
                minIndex = j
        if i != minIndex:
            arr[i], arr[minIndex] = arr[minIndex], arr[i]
    return arr

arr = [13, 4, 2, 8, 45, 36, 12, 99]
result = selectionsort(arr)
print(str(result))

二、插入排序

1. 算法思路

依次将未排序元素插入已排序元素的合适位置。
算法步骤:
1) 将待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
2)从头到尾依次获取未排序序列元素current,将current插入已排序序列的合适位置。(如果待插入的元素与已排序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

2. 实现代码

def insertion_sort(arr):
    for i in range(len(arr)):
        current = arr[i]
        preIndex = i - 1
        while (preIndex >= 0 and arr[preIndex] > current):
            arr[preIndex + 1] = arr[preIndex]
            preIndex -= 1
        arr[preIndex + 1] = current
    return arr

arr = [1, 2, 6, 4, 3, 8, 7, 10, 9, 5]
print(str(insertion_sort(arr)))

三、希尔排序

1. 算法思路

希尔排序就是插入排序的升级版,使用先分组再插入排序的思路。先将整个待排序的序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。
算法步骤:
1) 初始化gap,我这里根据经验使用大于数组arr的1/3长度的gap;
2)然后使用gap对arr进行分组,其实就是从第i个元素开始(往元素下标减小方向),将间隔为gap的多个元素看成一组,然后对元素 i 进行直接插入排序;
3)重复步骤2)(len(arr) - gap)次,完成对下标为gap、gap+1、…、len(arr)元素的分组插入排序;
4)然后缩小gap,我这里一次缩小3倍(向下取整),直至gap为1完成最后一次循环。

2. 实现代码

def shell_sort(arr):
    import math
    gap = 1
    while (gap < len(arr)/3):
        gap = gap * 3 + 1
    while gap > 0:
        for i in range(gap, len(arr)):
            temp = arr[i]
            j = i - gap
            while j >= 0 and arr[j] > temp:
                arr[j + gap] = arr [j]
                j -= gap
            arr[j + gap] = temp
        gap = math.floor(gap / 3)
    return arr
arr = [4, 7, 8, 1, 2, 4, 10, 9]
print(shell_sort(arr))

总结

对排序算法的总结。

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

奇迹行者还在打野

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值