python实现经典排序算法,附手撕code

排序无序数组  912. 排序数组

快排

import random

class Solution:
    def sortArray(self, nums: List[int]) -> List[int]:
        def quick(left, right):
            if left>right:
                return 

            k = random.randint(left, right)
            nums[left], nums[k] = nums[k], nums[left]
            pivot = nums[left]

            i, j = left+1, right
            while True:
                while i<=j and nums[i]<pivot:
                    i += 1
                while i<=j and nums[j]>pivot:
                    j -= 1
                if i>j:
                    break
                nums[i], nums[j] = nums[j], nums[i]
                i += 1
                j -= 1
            
            nums[left], nums[j] = nums[j], nums[left]
            quick(left, j-1)
            quick(j+1, right)
        quick(0, len(nums)-1)
        return nums

插入排序

class Solution:
    def insertion_sort(self, nums: List[int]) -> List[int]:
        n = len(nums)
        if n == 0:
            return nums
        for i in range(n-1):
            cur = nums[i+1]
            pre_index = i 
            while pre_index >=0 and cur<nums[pre_index]:
                nums[pre_index+1] = nums[pre_index]
                pre_index -= 1
            nums[pre_index+1] = cur
        return nums

if __name__ == '__main__':
    import sys
    data = sys.stdin.read().split()
    nums = list(map(int, data))
    result = insertion_sort(nums)
    print(' '.join(map(str, result)))

冒泡

def bubble_sort_optimized(arr):
    n = len(arr)
    for i in range(n):
        swapped = False
        for j in range(n - 1 - i):
            if arr[j + 1] < arr[j]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                swapped = True
        if not swapped:
            break
    return arr


if __name__ == '__main__':
    import sys
    data = sys.stdin.read().split()
    nums = list(map(int, data))
    result = bubble_sort_optimized(nums)
    print(' '.join(map(str, result)))
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值