一、冒泡排序,每次都将当前最大的数移动到数组一侧
对含有n个数的数组,需要运行n-1趟(i),对每个运行过一趟,冒泡时都可以减少一个遍历的数(j),通过flag可以在减少循环次数。
class Solution:
def BubbleSort(self,nums:[int])->[int]:
for i in range(len(nums)-1):
flag=False #标志是否发生交换
for j in range(len(nums)-i-1):
if nums[j]>nums[j+1]:
nums[j],nums[j+1]=nums[j+1],nums[j]
flag=True
if not flag:
break
return nums
二、选择排序
思路:将数组划分两块,左侧已排序,右侧未排序。每次从无序区间取出最小的元素,放到有序区间的末尾。
用min_i记录未排序中最小值的位置
class Solution:
def SelectSort(self,nums:list[int])->list[int]:
for i in range(len(nums)-1):#从0开始,遍历到下标n-2,相当于有序区间从【0,1】->【0,n-2】留下的最后一个是最大的数,不用排
min_i=i
for j in range(i+1,len(nums)):#遍历未排序的下标【0,n-1】,找出无序数组中最小的下标
if nums[j]<nums[i]:
min_i=j
if min_i != i:
nums[i],nums[min_i]=nums[min_i],nums[i]
return nums
插入排序
与选择排序类似,分为有序区间无序区间
class Solution:
def InsertSort(self,nums:list[int])->list[int]:
for i in range(1,len(nums)):
for j in range(i):
if nums[j]>nums[i]:
nums[j],nums[i]=nums[i],nums[j]
return nums
num=[10,3,5,6,8,2,0,1]
a=Solution
new=a.InsertSort(a,num)
练习题LCR 164、破解闯关密码,按选择排序发现做不出来,因为数组中的数是包含两位数的,按大小排序会导致【13,4】排序之后是413,而不是134。
需要用到sort,手写一个比较规则
class Solution:
def crackPassword(self, password: list) -> str:
def cmp(a,b):
if a+b == b+a:
return 0
elif a+b>b+a:
return 1
else:
return -1
num_s=list(map(str,password))
num_s.sort(key=functools.cmp_to_key(cmp))
return ''.join(num_s)
283、移动0
方法一、遍历数组,如果其中的某个元素等于0就先删除,再在数组的尾部添加0
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
n=len(nums)
ans=0
i=0
if any(item == 0 for item in nums):
flag=1
else:
flag=0
while ans<n:
if flag:
if nums[i]==0:
nums.pop(i)
nums.append(0)
i-=1
ans+=1
i+=1
else:
break
return nums
方法二、用i遍历数组,i0用于记录i查找到非零的数需要移动的位置,每次移动了一个非零数后i0+1,这样可以让非零得数按原来的相对位置移动到数组的最左侧。
class Solution:
def moveZeroes(self, nums: List[int]) -> None:
i0=0
for i in range(len(nums)):
if nums[i]!=0:
nums[i],nums[i0]=nums[i0],nums[i]
i0+=1
return nums