LC打怪录 插入排序 912.排序数组

1.3 插入排序 | 菜鸟教程

def insertionSort(nums):
    # 数组长度
    n = len(nums)
    # 如果 nums 为空或只有一个元素
    if n <= 1:
        # 不需要插入排序,直接返回
        return nums
    # 从 i = 1 的位置开始选择排序
    for i in range(1, n):
        # nums[i] 与 “nums[i - 1]...nums[0] 比较”
        for j in range(i, 0, -1):
            # 如果当前值小于前一个值
            if nums[j] < nums[j - 1]:
                # 交换位置
                nums[j], nums[j - 1] = nums[j - 1], nums[j]
                # 如果当前值大于前一个值
            else:
                # 证明已经插入到合适的位置直接跳出即可
                break
    # 返回数组
    return nums
def insertionSort(arr):
    for i in range(len(arr)):
        preIndex = i-1
        current = arr[i]
        while preIndex >= 0 and arr[preIndex] > current:
            arr[preIndex+1] = arr[preIndex]
            preIndex-=1
        arr[preIndex+1] = current
    return arr
def insertion_sort(nums: list[int]):
    """插入排序"""
    # 外循环:已排序区间为 [0, i-1]
    for i in range(1, len(nums)):
        base = nums[i]
        j = i - 1
        # 内循环:将 base 插入到已排序区间 [0, i-1] 中的正确位置
        while j >= 0 and nums[j] > base:
            nums[j + 1] = nums[j]  # 将 nums[j] 向右移动一位
            j -= 1
        nums[j + 1] = base  # 将 base 赋值到正确位置
class Solution:
    def sortArray(self, nums: List[int]) -> List[int]:
        if len(nums) <= 1:
            return nums

        # 随机取数 避免因为pivot区分度不强造成的算法退化
        pivot = random.choice(nums)

        # O(n)划分
        left  = self.sortArray([x for x in nums if x < pivot])
        right = self.sortArray([x for x in nums if x > pivot])
        
        # 相同值保留 避免因为大量相同元素造成的算法退化
        mid  = [x for x in nums if x == pivot]

        return left + mid + right 

思路五:插入排序
类似打扑克牌的时候,每次会把新摸的牌插入到已经排好序的牌里

从第2个元素开始遍历,和前面的数字比较
将比当前数大的元素依次后移,然后把当前数放在最后一个比它大的数字的原位置
对从第2个元素开始每个数都进行以上操作

class Solution:
    def sortArray(self, nums: List[int]) -> List[int]:
        n = len(nums)
        for i in range(1, n):
            tmp = nums[i]
            j = i
            while j > 0 and nums[j - 1] > tmp:
                nums[j] = nums[j - 1]
                j -= 1
            nums[j] = tmp
        return nums

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值