【排序】算法(python实现)

本文深入讲解了Python中的排序算法,包括直接插入排序、希尔排序、简单选择排序和堆排序等。详细介绍了每种算法的原理、实现代码及应用场景,帮助读者理解和掌握不同排序算法的特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


在这里插入图片描述

python 排序算法

1 插入排序

1.1 直接插入排序

算法思想

直接插入排序的核心思想就是:将数组中的所有元素依次跟前面已经排好的元素相比较,如果选择的元素比已排序的元素小,则交换,直到全部元素都比较过。
因此,从上面的描述中我们可以发现,直接插入排序可以用两个循环完成:

  • 第一层循环:遍历待比较的所有数组元素

  • 第二层循环:将本轮选择的元素(selected)与已经排好序的元素(ordered)相比较。如果:selected > ordered,那么将二者交换

      #直接插入排序
      def insert_sort(L):
          #遍历数组中的所有元素,其中0号索引元素默认已排序,因此从1开始
          for x in range(1,len(L)):
          #将该元素与已排序好的前序数组依次比较,如果该元素小,则交换
          #range(x-1,-1,-1):从x-1倒序循环到0
              for i in range(x-1,-1,-1):
          #判断:如果符合条件则交换
                  if L[i] > L[i+1]:
                      L[i] ,L[i+1] = L[i+1],L[i]
          return L
    

1.2 希尔排序

在这里插入图片描述

算法思想

希尔排序在数组中采用跳跃式分组的策略,通过某个增量(gap初始值一般为len(元素长度)//2)将数组元素划分为若干组,然后分组进行插入排序,这算是一趟排序,(下一趟)随后逐步缩小增量,继续按组进行插入排序操作,直至增量为1。希尔排序通过这种策略使得整个数组在初始阶段达到从宏观上看基本有序,小的基本在前,大的基本在后。然后缩小增量,到增量为1时,其实多数情况下只需微调即可,不会涉及过多的数据移动。
解法1:

def shell_sort(alist):
    """希尔排序"""
    n = len(alist)
    gap = n // 2
    while gap >= 1:
        for j in range(gap, n):
            i = j
            while (i - gap) >= 0:
                if alist[i] < alist[i - gap]:
                    alist[i], alist[i - gap] = alist[i - gap], alist[i]
                    i -= gap
                else:
                    break
        gap //= 2


if __name__ == '__main__':
    alist = [54, 26, 93, 17, 77, 31, 44, 55, 20]
    print("原列表为:%s" % alist)
    shell_sort(alist)
    print("新列表为:%s" % alist)

解法2:

def shell_sort(alist):
    gap = len(alist)
    while gap > 1:
        gap = gap // 2
        for i in range(gap, len(alist)):
            for j in range(i % gap, i, gap):
                if alist[i] < alist[j]:
                    alist[i], alist[j] = alist[j], alist[i]
    return alist
 
alist = shell_sort([4,5,6,7,3,2,6,9,8])
print (alist)

2. 选择排序

2.1 简单选择排序

选择排序不受输入数据的影响,即在任何情况下时间复杂度不变。选择排序每次选出最小的元素,因此需要遍历 n-1 次。
在这里插入图片描述
def selectionSort(nums):
for i in range(len(nums) - 1): # 遍历 len(nums)-1 次
minIndex = i
for j in range(i + 1, len(nums)):
if nums[j] < nums[minIndex]: # 更新最小值索引
minIndex = j
nums[i], nums[minIndex] = nums[minIndex], nums[i] # 把最小数交换到前面
return nums

2.2 堆排序

堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:

  • 大根堆:每个节点的值都大于或等于其子节点的值,用于升序排列;
  • 小根堆:每个节点的值都小于或等于其子节点的值,用于降序排列。
    在这里插入图片描述

参考

(1).https://blog.csdn.net/mxz19901102/article/details/80087596
(2).https://www.jianshu.com/p/bbbab7fa77a2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值