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