Day06 数组排序

一、冒泡排序,每次都将当前最大的数移动到数组一侧

        对含有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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值