排序算法汇总(python版)——选择排序、冒泡排序、插入排序、快速排序

本文将介绍十大排序中比较常用的排序方法,所有排序均由python实现

选择排序

选择排序是在每一轮中选择数组中现存最大/最小的数字,取出来,放在首位。
选择排序是不稳定
时间复杂度:O(n2)
空间复杂度:O(1)

代码实现

def select_sort(nums):
    for i in range(len(nums)): 
	    min_idx = i 
	    # 找到最小的数字
	    for j in range(i+1, len(nums)): 
	        if nums[min_idx] > nums[j]: 
	            min_idx = j
	    #放到开头
	    nums[i], nums[min_idx] = nums[min_idx], nums[i]

冒泡排序

不断的对比相邻的数字,交换位置,让最大/最小的数字沉底
冒泡排序是稳定的
时间复杂度:O(n2)
空间复杂度:O(1)

代码实现

def bubble_sort(nums):
    n = len(nums)
    for c in range(n):
        for i in range(1, n - c):
            if nums[i - 1] > nums[i]:
                nums[i - 1], nums[i] = nums[i], nums[i - 1]
    return nums

插入排序

遍历每一个元素,把这个元素插入到前面已经排序好的数组里
插入排序是稳定的
时间复杂度:O(n2)
空间复杂度:O(1)

代码实现

def insert_sort(nums):
    n = len(nums)
    for i in range(1, n):
        while i > 0 and nums[i - 1] > nums[i]: # 找插入位置
            nums[i - 1], nums[i] = nums[i], nums[i - 1]
            i -= 1
    return nums

快速排序

快速排序需要选取一个哨兵pivot,还有leftright两个指针,然后把数组中比pivot小的放左边,比privot大的放右边。
left和right先设为数组最左边的和最右边的数

def quick_sort(nums):
    n = len(nums)

    def quick(left, right):
        if left >= right:  # 结束递归
            return nums
        pivot = left  # 设定基准
        i = left
        j = right
        while i < j:
            while i < j and nums[j] > nums[pivot]:#右边大于哨兵时继续移动,直到找到比哨兵小的
                j -= 1
            while i < j and nums[i] <= nums[pivot]:
                i += 1
            nums[i], nums[j] = nums[j], nums[i]#交换位置
        nums[pivot], nums[j] = nums[j], nums[pivot]#左右坐标重合,把哨兵放到该位置
        #分别对两边的数组继续排序
        quick(left, j - 1)
        quick(j + 1, right)
        return nums

    return quick(0, n - 1)

(持续更新中。。。。陆续添加其他排序算法)
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值