leetcode283 剑指45

109 阅读2分钟

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