【Leetcode】八大排序

总述

插入排序:直接插入排序;希尔排序;

选择排序:简单选择排序;堆排序;

交换排序:冒泡排序;快速排序;

归并排序;

桶排序/基数排序;

 直接插入排序

选取未排序区域的第一个元素,从后至前逐个与已排序区域的元素两两比较,若arr[i-1]>arr[i](前者大),交换arr[i-1]和arr[i],i-=1;需要保证已排序区域再加入这个元素后仍然有序——打扑克;

时间复杂度:最优O(n)--满足排序要求  最坏O(n^2)--与排序要求相反

空间复杂度:O(1)--原地实现

稳定性:稳定

def insertion_sort(arr):
    
    length = len(arr)
    if length <= 1:return

    for i in range(length):
        cur_index = i
        while cur_index-1 >= 0 and arr[cur_index-1] > arr[cur_index]:
            arr[cur_index], arr[cur_index-1] = arr[cur_index-1], arr[cur_index]
            cur_index -= 1

    return arr
希尔排序-缩小增量排序

通过比较一定间隔的元素进行插入排序,同时不断缩小间隔(增量),直到比较相邻元素。当增量为0时,算法终止。

时间复杂度:依赖于gap的选择,平均复杂度O(n^1.5)

空间复杂度:O(1)--原地实现

稳定性:不稳定

def shell_sort(arr):
    n = len(arr) 
	gap = n // 2
	while gap>0:
		for i in range(gap, n):
			while i-gap >= 0 and arr[i-gap]>arr[i]:
				arr[i], arr[i-gap] = arr[i-gap], arr[i]
				i -= gap
		gap = gap // 2

	return arr
选择排序

搜索未排序区域的最小值(最大值),将其交换到已排序区域的末尾,然后扩大已排序范围,直至得到升序(降序)排列;

时间复杂度:O(n^2)

空间复杂度:O(1)--原地实现

稳定性:不稳定

def select_sort(arr):

    length = len(arr)
    if length <= 1:return

    for i in range(length):
        min_index = i

        for j in range(i+1, length):
            if arr[min_index] > arr[j]:
                min_index = j

        if min_index != i:
            arr[min_index], arr[i] = arr[i], arr[min_index]
 堆排序

 通过数据上浮构造初始大根堆,然后将最大值与最后一个数交换,通过数据下沉恢复除最后一个节点的大根堆,实现倒序构造升序数组;

时间复杂度:O(nlogn)

空间复杂度:O(1)--原地实现

稳定性:不稳定

def heapify(arr, index, end):
    while True:
        left, right = 2*idx+1, 2*idx+2
        if right < end: cur = left if nums[left]>nums[right] else right
        elif left < end: cur = left
        else: break
 
        if nums[cur]>nums[idx]:
            nums[cur], nums[idx] = nums[idx], nums[cur]
            idx = cur
        else:break
    return


def heap_sort(arr):
    n = len(arr)
    for i in range(n//2, -1, -1):
        heapify(arr, i, n)
    for i in range(n-1, 0, -1):
        arr[0], arr[i] = arr[i], arr[0]
        heapify(arr, 0, i)   # 调整边界
    return arr
冒泡排序

对未排序区域的元素两两比较,将较大值(较小值)向后交换,然后缩小未排序范围,直至未排序范围清空时得到升序(降序)排列;

时间复杂度:最优O(n)--满足排序要求  最坏O(n^2)--与排序要求相反

空间复杂度:O(1)--原地实现

稳定性:稳定

def bubble_sort(arr):

    length = len(arr)
    if length <= 1:return

    for i in range(length):
        is_made_swap = False               # 设置标志位

        for j in range(length - i - 1):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                is_made_swap = True

        if not is_made_swap: break         # 无交换代表已经有序
快速排序

step1.从数列中挑出一个元素,称为"基准"(pivot),
step2.重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区结束之后,该基准就处于数列的中间位置。这个称为分区(partition)操作。
step3.递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序。

时间复杂度:最优O(nlogn)--每次接近二分  最坏O(n^2)--每次只分出一个

空间复杂度:O(logn)

稳定性:不稳定

def partition(nums, left, right):
    pivot = nums[left]                 #初始化一个待比较数据
    i,j = left, right
    while i<j:
        while(i<j and nums[j]>=pivot): #从后往前查找,直到找到一个比pivot更小的数
            j-=1
        nums[i] = nums[j]              #将更小的数放入左边
        while(i<j and nums[i]<=pivot): #从前往后找,直到找到一个比pivot更大的数
            i+=1
        nums[j] = nums[i]              #将更大的数放入右边
    
    nums[i] = pivot                    #待比较数据放入最终位置 
    return i                           #返回待比较数据最终位置

def quicksort(nums, left, right):
    if left < right:
        index = partition(nums, left, right)
        quicksort(nums, left, index-1)
        quicksort(nums, index+1, right)
归并排序

把长度为n的输入序列分成两个长度为n/2的子序列,在子序列中也采用归并排序;当子序列中排序完成后,将其合并;

时间复杂度:最优O(n)   最坏O(nlogn)

空间复杂度:O(n)

稳定性:不稳定

def merge_sort(arr):
	if len(arr) <= 1:
		return arr
   
	mid = len(arr) // 2    
	left = merge_sort(arr[:mid])
	right = merge_sort(arr[mid:])
	return merge(left, right)   
    
def merge(left, right):
	new = []
	i = j = k = 0
	while(i < len(left) and j < len(right)):
		if left[i] < right[j]:
			new.append(left[i])
			i += 1
		else:
			new.append(right[j])
			j += 1
	new = new + left[i:] + right[j:]
	return new

 桶排序/基数排序

将数据按位进行分桶,按桶代表的数值进行排序,然后切换到下一个位;

def radix_sort(arr):
    max_num = max(arr)
    place = 1
    while max_num >= 10**place:  # 统计最大值的位数
        place += 1
    for i in range(place):
        buckets = [[] for _ in range(10)]
        for num in array:
            radix = int(num/(10**i) % 10)
            buckets[radix].append(num)
        j = 0
        for k in range(10):
            for num in buckets[k]:
                arr[j] = num
                j += 1
    return arr

备注:

冒泡排序和选择排序大体思路一致,区别在于冒泡是通过交换都得到未排序区域的最值,而选择只记录了对应下标;冒泡的有序区域在列表末尾,选择的有序区域在列表开头(这个也可换);冒泡比较出相对关系,可在满足要求时提前结束排序,而选择无法优化;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/608330.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

NVIDIA Omniverse Cloud API支持数字孪生开发,可解决复杂AI问题 | 最新快讯

在全球范围内&#xff0c;价值超过 50 万亿美元的重工业市场&#xff0c;正在竞相实现数字化。 基于此&#xff0c;为帮助数字孪生技术更好地赋能千行百业&#xff0c;AI 企业 NVIDIA 在架构底层算力的同时&#xff0c;也搭建了 NVIDIA AI Enterprise 和 Omniverse 两大平台。 …

【隧道篇 / WAN优化】(7.4) ❀ 03. WAN优化的原理 ❀ FortiGate 防火墙

【简介】相信对WAN优化感兴趣的人都会有疑问&#xff0c;WAN优化真的有作用吗&#xff1f;如果真的有作用&#xff0c;那是根据什么原理呢&#xff1f;让我们来更深入的了解一下。 客户端和服务器端 其实很多人在一开始看到WAN优化这个词&#xff0c;就自然的以为上网速度太慢&…

基于51单片机的智能垃圾桶仿真设计( proteus仿真+程序+设计报告+原理图+讲解视频)

这里写目录标题 1. 主要功能&#xff1a;2. 讲解视频&#xff1a;3. 仿真4. 程序代码5. 设计报告6. 原理图7. 设计资料内容清单资料下载链接&#xff1a; 基于51单片机智能垃圾桶仿真设计( proteus仿真程序设计报告原理图讲解视频&#xff09; 仿真图proteus8.9及以上 程序编译…

ABB RobotStudio学习记录(一)新建工作站

RobotStudio新建工作站 最近遇到 虚拟示教器和 Rapid 代码不能控制 视图中机械臂的问题&#xff0c;其实是由于机械臂和工作站不匹配。以下是解决方法。 名称版本Robot Studio6.08 新建一个”空工作站“&#xff1b; 在目标位置新建一个目标文件夹 C:\solution\test&#xff0…

鸿蒙内核源码分析(文件概念篇) | 为什么说一切皆是文件

什么是文件 不说清楚什么是文件就说不清楚文件系统,更说不清楚内核是如何管理和为什么要这么来管理文件的。现代操作系统为解决信息能独立于进程之外被长期存储引入了文件,将文件抽象成一个宽泛的概念,把文档、目录&#xff08;文件夹&#xff09;、键盘、监视器、硬盘、可移动…

视频监控平台:交通运输标准JTT808设备SDK接入源代码函数分享

目录 一、JT/T 808标准简介 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;协议特点 1、通信方式 2、鉴权机制 3、消息分类 &#xff08;三&#xff09;协议主要内容 1、位置信息 2、报警信息 3、车辆控制 4、数据转发 二、代码和解释 &#xff08;一…

C语言leetcode刷题笔记1

C语言leetcode刷题笔记1 第1题&#xff1a;136.只出现一次的数字两次遍历&#xff08;O(numsSize^2)&#xff09;位运算 第2题&#xff1a;202.快乐数快慢指针记录历史数据 第3题&#xff1a;53.最大子数组和暴力求解&#xff08;超时&#xff09;动态规划分治 第1题&#xff1…

机器学习初学者 6 个核心算法!建议收藏,反复观看!

今天再来介绍机器学习算法的基本概念和适用场景&#xff01; 首先&#xff0c;引用一句英国统计学家George E. P. Box的名言&#xff1a;All models are wrong, but some are useful. 没有哪一种算法能够适用所有情况&#xff0c;只有针对某一种问题更有用的算法。 也就是说&…

【新版系统架构】知识点背诵默写本

前言 系统架构考试在即&#xff0c;想要考试的人肯定感受到了沉甸甸的压力和紧迫感&#xff0c;脑海中不断闪过知识点的画面&#xff0c;却让人有些头昏脑胀&#xff0c;发现很难完全记住&#xff0c;这个考试很难&#xff0c;知识点很多。这次我在准备考试的同时&#xff0c;…

Android GPU渲染屏幕绘制显示基础概念(1)

Android GPU渲染屏幕绘制显示基础概念&#xff08;1&#xff09; Android中的图像生产者OpenGL&#xff0c;Skia&#xff0c;Vulkan将绘制的数据存放在图像缓冲区中&#xff0c;Android中的图像消费SurfaceFlinger从图像缓冲区将数据取出&#xff0c;进行加工及合成。 Surface…

华为云CodeArts API专场直播来袭!——探索API全生命周期管理新趋势

API的全生命周期管理是否让你摸不清头脑&#xff1f;你是否对API的前沿技术和应用充满了好奇&#xff0c;渴望一探究竟&#xff1f; 华为云PaaS服务即将在5月10日16:00&#xff0c;为你带来一场别开生面的CodeArts API专场直播活动&#xff01; 你可以在轻松愉快的氛围中&…

小巧简单实用的Linux端口转发工具Rinetd

Linux下实现端口转发有很多种方法&#xff0c;尤其是在可以联网的情况下&#xff0c;更是容易。最近在资源受限的定制系统中&#xff0c;找到一个方便离线安装和使用的端口转发工具Rinetd&#xff0c;安装包仅几十K&#xff0c;而且有很多版本的Linux发行系统的支持。 1、安装…

水质监测设备预警系统

随着工业化进程的加快和城市化水平的提高&#xff0c;水质安全问题愈发受到社会各界的广泛关注。为了确保水资源的清洁与安全&#xff0c;水质监测设备预警系统成为了不可或缺的利器。在这个背景下&#xff0c;HiWoo Cloud平台凭借其先进的技术和卓越的性能&#xff0c;为水质监…

【已解决】直接在远程新增文件本地再提交报Merge branch ‘master‘ of

【已解决】直接在远程新增文件本地再提交报Merge branch ‘master’ of … 1、问题产生背景 直接在远程仓库新建了md文件&#xff0c;本地库修改了文件已添加到暂存区之后再提交报错 2、分析 远程新建文件产生变更&#xff0c;版本号与本地拿到的不一致&#xff0c;本地再次提…

Docker 安装的MySQL迁移数据库

1. 导出数据库 docker ps :查看数据库对应的 CONTAINER ID docker exec -it id /bin/bash : 进入到mysql的docker实例中 cd /usr/bin : 进入到bin目录 mysqldump -u root -p123456 study > /root/study_backup0509.sql :使用mysqldump备份库&#xff0c;注意密码与-p之间…

PopChar for Mac v10.1激活版:特殊字符输入工具

PopChar for Mac是一款专为Mac用户设计的字符输入工具&#xff0c;其简单直观的功能使得查找和插入特殊字符变得轻而易举。 PopChar for Mac v10.1激活版下载 首先&#xff0c;PopChar为Mac提供了访问所有字体字符的能力&#xff0c;包括那些难以通过键盘直接输入的字符。用户只…

【3dmax笔记】032: 编辑顶点

一、编辑顶点概述 (1)启动安装好的3dmax软件。 (2)选择顶视图,用图形画出一个矩形。 (3)选择矩形,右击鼠标,将矩形转换成可编辑样条线。 (4)进入顶点层级。 展开可编辑样条线,选择顶点层级(快捷键为1,在不展开样条线的情况下也可以选择顶点层级)。选择后,可以…

postman介绍、安装、使用、功能特点、注意事项

Postman是一款流行的API开发工具&#xff0c;它提供了丰富的功能&#xff0c;包括创建、测试、调试和文档化API。本文将介绍Postman的安装、使用方法&#xff0c;以及其功能特点和注意事项。 1. 介绍 Postman是一款用于构建、测试和调试API的工具&#xff0c;它提供了用户友好的…

串口通信---了解

1 串口接线方式 RXD&#xff1a;数据输入引脚&#xff0c;数据接受&#xff1b;STC89系列对应P3.0口 TXD&#xff1a;数据发送引脚&#xff0c;数据发送&#xff1b;STC89系列对应P3.1口 接线方式 串口编程要素 输入/输出数据缓冲器叫做SBUF&#xff0c;都用99H地址码&#x…

链式二叉树的基本操作1

1.概念回顾 讲二叉树的基本操作之前&#xff0c;我们回顾一下二叉树的概念 在讲树之前&#xff0c;我们的每讲一种数据结构&#xff0c;无外乎就是在讲它们的增删查改&#xff0c;但是在树这里&#xff0c;就有了不小变化。 2.结点的定义 既然是链式二叉树&#xff0c;那必须…