Task 03 数组排序
排序稳定性:多个元素如果有相同的key,则排序前后他们的先后顺序不变。
冒泡排序(Bubble Sort)
冒泡排序法是通过相邻元素之间的比较与交换,使值较小的元素逐步从后面移到前面,值较大的元素从前面移到后面。
最好时间复杂度O(n)(原数组为顺序),最差时间复杂度O(n2) (原数组逆序,双循环),稳定
第一次比较前n个元素,第二次比较前n-1个元素
for i in range(len(L)):
for j in range(len(L)-1-i):
if L[j]>L[j+1]:
L[j],L[j+1]=L[j+1], L[j]
选择排序(Selection Sort)
每次排序将序列中最小的元素放在前面,每次排序的序列为后n-i+1个元素
有固定时间复杂度O(n2),不稳定
def selectionSort(arr):
for i in range(len(arr) - 1):
# 记录未排序序列中最小数的索引
min_i = i
for j in range(i + 1, len(arr)):
if arr[j] < arr[min_i]:
min_i = j
# 如果找到最小数,将 i 位置上元素与最小数位置上元素进行交换
if i != min_i:
arr[i], arr[min_i] = arr[min_i], arr[i]
return arr
插入排序(Insertion Sort)
将数组分为两部分,将无序序列的第一个元素插入到前一序列适当的位置
时间复杂度O(n2),稳定
def insertionSort(arr):
for i in range(1, len(arr)):
temp = arr[i]
j = i
while j > 0 and arr[j - 1] > temp:
arr[j] = arr[j - 1]
j -= 1
arr[j] = temp
return arr
剑指 Offer 45. 把数组排成最小的数
输入一个非负整数数组,把数组里所有数字拼接起来排成一个数,打印能拼接出的所有数字中最小的一个。
示例 1:
输入: [10,2] 输出: “102”
使用python内置函数:使用sort方法,自定义排序规则
sort高级用法
class Solution:
def minNumber(self, nums: List[int]) -> str:
def sort_rlue(x,y):
if x+y<y+x:return -1
if x+y>y+x:return 1
else:return 0
s=[str(i) for i in nums]
s.sort(key=functools.cmp_to_key(sort_rlue))
return "".join(s)
283. 移动零
给定一个数组 nums,编写一个函数将所有 0 移动到数组的末尾,同时保持非零元素的相对顺序。
双指针:快指针每次向右移动一个元素,并于慢指针指向的元素交换位置,慢指针指向元素非0时向右移动,指向零时不动.
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
slow,fast=0,0
for i in range(len(nums)):
fast=i
nums[slow],nums[fast]=nums[fast],nums[slow]
if nums[slow]!=0:
slow+=1