数据结构—排序算法(python实现)

数据结构

  • 脑图
  • 排序算法
    • 1.冒泡排序
      • 1.1步骤
      • 1.2python代码实现冒泡:
      • 1.3分析冒泡
    • 2.插入排序
      • 2.1步骤
      • 2.2python代码实现插入排序:
      • 2.3分析插入
    • 3.选择排序
      • 3.1步骤
      • 3.2python代码实现:
      • 3.3分析选择
    • 4.快速排序
      • 4.1步骤
      • 4.2python代码实现:
      • 4.3分析快排
    • 5.希尔排序
      • 5.1步骤
      • 5.2python代码实现:
      • 5.3分析
    • 6.归并排序
      • 6.1步骤
      • 6.3python代码实现:
      • 6.4分析

脑图

算法

排序算法

稳定性,简单解释就是两个相同的值经过算法后是否依旧能保持前面的在前面,后面的在后面

1.冒泡排序

1.1步骤

1.比较第一个与第二个,如果前者大则交换位置
2.推进,即比较第二个和第三个
3.重复上述步骤

这个数据就如同气泡一样,将大的往后移,小的往前推。用冒泡排序命名可以说是很形象了

1.2python代码实现冒泡:

# 冒泡排序
def bubbles_sort(arr):# 循环列表长度for i in range(1, len(arr)):# 对于每一个arr[j]与后一个arr[j+1]进行对比for j in range(0, len(arr)-i):# 比较if arr[j] > arr[j+1]:# 前者大则交换两者位置arr[j], arr[j + 1] = arr[j + 1], arr[j]return arrbubbles_sort([5,4,3,2,1])

1.3分析冒泡

时间复杂度:最坏情况:O(N**2)
      最好情况:O(N)
空间复杂度:O(1)
稳定

2.插入排序

2.1步骤

1.将数组分为两个部分已经排序和未排序(初始认为第一个已经排序,后面的为未排序)
2.取未排序的第一个,与已排序的进行对比,并加入进已经排序的数组
3.重复第二步,直至未排序的为空

这个方式就如同打牌时摸牌一样,将牌堆中抽上来的牌与手牌进行对比,再决定插入哪个地方,最后继续抽牌。

2.2python代码实现插入排序:

# 插入排序
def insertion_sort(arr):for i in range(1, len(arr)):# 取值(抽牌)key = arr[i]j = i-1# 选择插入位置while j >= 0 and key < arr[j]:arr[j+1] = arr[j]j -= 1arr[j+1] = keyreturn arr
insertion_sort([5,4,3,2,1])

2.3分析插入

时间复杂度:最坏情况下为O(N**2),此时待排序列为逆序,或者说接近逆序
      最好情况下为O(N),此时待排序列为升序,或者说接近升序。
空间复杂度:O(1)
稳定

3.选择排序

3.1步骤

1.将数组分为两个部分已经排序和未排序(初始全部为未排序),
2.寻找未排序中的最小的值,并且与未排序中的第一个交换位置
3.重复2,直到未排序全部有序

可以发现,其中就是寻找最小值,放入有序的过程

3.2python代码实现:

# 选择排序
def select_sort(arr):# 循环寻找最小值for i in range(len(arr)):min_index=0min=arr[i]for j in range (i+1,len(arr)):if arr[j]<min:min=arr[j]min_index=j# 如果位置不同则交换位置if min!=arr[i]:arr[i],arr[min_index]=arr[min_index],arr[i]return arrarr = [23, 25, 12, 22, 11]
sorted_arr = select_sort(arr)

3.3分析选择

时间复杂度:最坏情况:O(N^2)
      最好情况:O(N^2)
空间复杂度:O(1)
不稳定
事实上我们也可以同时选出最大最小值放入两边

4.快速排序

这个有两种方法(其实都是一种思路,不同的实现方式)

4.1步骤

方法1
1.令第一个数据为基准,并且利用两个指针l和r指向队首和队尾(如果只有一个数据则返回自己)
2.将r的数据与基准进行对比,如果大于基准则指向上一个数据,如果小于则与l进行交换
3.将l的数据与基准进行对比,如何小于基准则指向下一个数据,如果大于则与r进行交换
4.重复2和3,知道rhel指向同一个位置,这个位置就是基准的位置(此时左边的数全部小于基准,右边的数全部大于基准)
5.将左右两边的数列重复上述和此步骤,直到结束。

对于python,我们还有另一种方法

方法2
1.令第一个数据为基准(如果只有一个数据则返回自己)
2.利用列表推导式,直接选出所有小于基准,等于基准,大于基准的数
3.将小于基准的,大于基准的重复上述和此步骤,直到全部返回

快速排序主要是选择基准,将左边全部为小的,右边全部为大的,从而进行对比,并且利用了递归的思想,将两边重复从而实现有序

4.2python代码实现:

方法1:

def quick(arr):# 如果只有一个则无需排序if len(arr) <= 1:return arr# 选择基准base=arr[0]l=0r=len(arr)-1# 比较,交换数据while l<r:while l<r and arr[l]<base:l+=1while l<r and arr[r]>base:r-=1arr[l],arr[r]=arr[r],arr[l]# 将l和r重复时候的位置填入基准值arr[l],arr[0]=arr[0],arr[l]# 将左右递归return quick(arr[:l])+[arr[l]]+quick(arr[l+1:])
quick_sort([5,4,3,2,1])

方法2:

def quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[0]  # 选择小于基准的left = [x for x in arr if x < pivot]# 选择等于基准的middle = [x for x in arr if x == pivot]# 选择大于基准的right = [x for x in arr if x > pivot]# 递归return quick_sort(left) + middle + quick_sort(right)
quick_sort([5,4,3,2,1])

其实都是一个逻辑,将小的放左边,大的放右边

4.3分析快排

时间复杂度在最坏情况下是O(n^2)
平均情况O(n log n)
空间复杂度最坏情况下为O(n)
在平均情况下,是O(log n)。

5.希尔排序

5.1步骤

1.按照步长分组,并且将这组通过插入变为有序
2. 减小步长,重复步骤1
3. 直到步长变为1,数组有序

5.2python代码实现:

def shell_sort(arr):n = len(arr)gap = n // 2# 减小间隔进行排序while gap > 0:for i in range(gap, n):temp = arr[i]j = i# 插入排序while j >= gap and arr[j - gap] > temp:arr[j] = arr[j - gap]j -= gaparr[j] = tempgap //= 2# 测试希尔排序
arr = [12, 34, 54, 2,6, 3,1]
shell_sort(arr)
print("排序后的数组:", arr)

5.3分析

时间复杂度平均:O(N^1.3)
空间复杂度:O(1)
不稳定

6.归并排序

6.1步骤

1.分而治之,将一个数组按两个为一组进行分组,并让其有序
2.将两个有序数组之间两两组合,直到和为原来长度的大组

6.3python代码实现:

def merge_sort(arr):if len(arr) > 1:mid = len(arr) // 2  # 找到中间位置L = arr[:mid]  # 分割数组为两部分R = arr[mid:]merge_sort(L)  # 对左半部分进行排序merge_sort(R)  # 对右半部分进行排序i = j = k = 0# 合并过程while i < len(L) and j < len(R):if L[i] < R[j]:arr[k] = L[i]i += 1else:arr[k] = R[j]j += 1k += 1# 检查是否有剩余元素while i < len(L):arr[k] = L[i]i += 1k += 1while j < len(R):arr[k] = R[j]j += 1k += 1
arr = [12, 11, 13, 5, 6, 7]
merge_sort(arr)
print( arr)

6.4分析

平均时间复杂度:O(nlogn)
最佳时间复杂度:O(n)
最差时间复杂度:O(nlogn)
空间复杂度:O(n)
排序方式:In-place
稳定性:稳定

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Pinia管理用户数据

Pinia 是 Vue3 的新一代状态管理库&#xff0c;提供了更简单的 API 和更好的 TypeScript 支持。它作为 Vuex 的替代方案&#xff0c;成为了管理 Vue 应用状态的首选。Pinia 是 Vue3 的新一代状态管理库。与 Vuex 相比&#xff0c;Pinia 提供了更简单的 API、更好的性能&#xf…

远程协助软件Todesk免费版有什么限制

大名鼎鼎的远程todesk也开始出限制了&#xff0c;国内远程协助一直是向日葵一家独大&#xff0c;todesk起来以后慢慢占领了部分市场&#xff0c;随用户越来越多&#xff0c;其服务器也开始不堪重负了&#xff0c;于2024年的6月发了公告&#xff0c;出告了限制发表的措施具体如下…

电路基础——相量法

相量法 为什么要使用相量表示&#xff1f; 电路方程是微分方程&#xff1a; 电路的运算&#xff08;如KCL、KVL方程运算&#xff09;会涉及到两个正弦量的相加&#xff1a; 如下图所示同频率的正弦量相加仍得到同频率的正弦量&#xff0c;因此只需确定初相位和有效值。 基于上…

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件

20241129解决在Ubuntu20.04下编译中科创达的CM6125的Android10出现找不到库文件libncurses.so.5的问题 2024/11/29 21:11 缘起&#xff1a;中科创达的高通CM6125开发板的Android10的编译环境需要。 vendor/qcom/proprietary/commonsys/securemsm/seccamera/service/jni/jni_if.…

redis的应用----缓存

redis的应用----缓存 一、缓存的概念二、使用redis作为缓存2.1使用redis作为缓存的原因2.2缓存机制的访问步骤 三、缓存的更新策略3.1定期更新3.2实时更新3.3淘汰策略 四、缓存常见的问题4.1缓存预热(Cache preheating)4.2缓存穿透(Cache penetration)4.3缓存雪崩(Cache avalan…

【S500无人机】--地面端下载

之前国庆的时候导师批了无人机&#xff0c;我们几个也一起研究了几次&#xff0c;基本把无人机组装方面弄的差不多了&#xff0c;还差个相机搭载&#xff0c;今天我们讲无人机的调试 硬件配置如下 首先是地面端下载&#xff0c;大家可以选择下载&#xff1a; Mission Planne地…

C++设计模式(装饰模式)

一、介绍 1.动机 在某些情况下我们可能会“过度地使用继承来扩展对象的功能”&#xff0c;由于继承为类型引入的静态特质&#xff0c;使得这种扩展方式缺乏灵活性&#xff1b;并且随着子类的增多&#xff08;扩展功能的增多&#xff09;&#xff0c;各种子类的组合&#xff0…

Spring Cloud(Kilburn 2022.0.2版本)系列教程(五) 服务网关(SpringCloud Gateway)

Spring Cloud(Kilburn 2022.0.2版本)系列教程(五) 服务网关(SpringCloud Gateway) 一、服务网关 1.1 什么是网关 在微服务架构中&#xff0c;服务网关是一个至关重要的组件。它作为系统的入口&#xff0c;负责接收客户端的请求&#xff0c;并将这些请求路由到相应的后端服务…

MySQL底层概述—7.优化原则及慢查询

大纲 1.Explain概述 2.Explain详解 3.索引优化数据准备 4.索引优化原则详解 5.慢查询设置与测试 6.慢查询SQL优化思路 1.Explain概述 使用Explain关键字可以模拟查询优化器来执行SQL查询语句&#xff0c;从而知道MySQL是如何处理SQL语句的&#xff0c;从而分析出查询语句…

【前端】Vue3+Vite如何进行多环境配置呢

在项目或产品的迭代过程中需要分不同的环境&#xff0c;那么使用vitevue3开发时&#xff0c;该如何进行配置呢 1、添加配置文件 .env.xxx .env.xxx 需要与src在同一级目录下 例如&#xff1a; 开发环境&#xff1a; .env.development 开发环境&#xff1a; .env.test 生产环…

FreeSWITCH 简单图形化界面36 -使用mod_sms发送短消息

FreeSWITCH 简单图形化界面36 -使用mod_sms发送短消息 0、测试环境1、mod_sms模块安装2、编写聊天规则2.1 使用xml文件测试一下 2.2 使用脚本文件测试一下 0、测试环境 http://myfs.f3322.net:8020/ 用户名&#xff1a;admin&#xff0c;密码&#xff1a;admin FreeSWITCH界面…

广域网技术

企业需要通过广域网将这些分散在不同地理位置的分支机构连接起来 早期广域网技术概述 广域网&#xff1a;连接不同地区局域网的网络&#xff0c;能够横跨几个洲提供远距离通信&#xff0c;形成国际性的远程网络 广域网设备角色介绍&#xff1a; CE&#xff1a;用户端连接服务…

[GKCTF 2021]签到

[GKCTF 2021]签到 wireshark跟踪http流&#xff0c;基本编解码&#xff0c;倒叙&#xff0c;栅栏密码 找到cat /f14g 把包里返回的字符串先hex解码&#xff0c;再base64解码&#xff0c;看到一个时间是倒叙&#xff0c;不含flag 继续往下面翻&#xff0c;可以看到cat%2Ff14g%7…

ROS VSCode调试方法

VSCode 调试 Ros文档 1.编译参数设置 cd catkin_ws catkin_make -DCMAKE_BUILD_TYPEDebug2.vscode 调试插件安装 可在扩展中安装(Ctrl Shift X): 1.ROS 2.C/C 3.C Intelliense 4.Msg Language Support 5.Txt Syntax 3.导入已有或者新建ROS工作空间 3.1 导入工作…

Socket编程(TCP/UDP详解)

前言&#xff1a;之前因为做项目和找实习没得空&#xff0c;计算机网络模块并没有写成博客&#xff0c;最近得闲了&#xff0c;把计算机网络模块博客补上。 目录 一&#xff0c;UDP编程 1&#xff09;创建套接字 2&#xff09;绑定端口号 3&#xff09;发送与接收数据 4&…

虚拟机VMware安装OpenWrt镜像

前提已经安装VMware Workstation Pro,我使用的是VM16 一.下载OpenWrt系统固件 固件有很多种&#xff0c;我选择下面这个链接的固件: Index of /releases/23.05.3/targets/x86/64/ 二.把固件转换成虚拟机能识别的格式 转换工具下载地址&#xff1a;https://www.starwindsoft…

【Canvas与雷达】点鼠标可暂停金边蓝屏雷达显示屏

【成图】 【代码】 <!DOCTYPE html> <html lang"utf-8"> <meta http-equiv"Content-Type" content"text/html; charsetutf-8"/> <head><title>点鼠标可暂停金边蓝屏雷达显示屏 Draft1</title><style typ…

计算机编码存储+char占用空间+final作用

内存中存储的是对应的编码&#xff0c;与对应的形状库一起能够在显示器显示出来对应的字符。 磁盘中存储的是文件信息。 内存中存储的是变量&#xff08;虽然也是在磁盘里&#xff0c;等到使用的时候再调入进来&#xff09;。 因为编码实质就是二进制串&#xff0c;所以也可以比…

vue3项目搭建-6-axios 基础配置

axios 基础配置 安装 axios npm install axios 创建 axios 实例&#xff0c;配置基地址&#xff0c;配置拦截器,目录&#xff1a;utils/http.js 基地址&#xff1a;在每次访问时&#xff0c;自动作为相对路径的根 // axios 基础封装 import axios from "axios";…

2-2-18-9 QNX系统架构之文件系统(一)

阅读前言 本文以QNX系统官方的文档英文原版资料为参考&#xff0c;翻译和逐句校对后&#xff0c;对QNX操作系统的相关概念进行了深度整理&#xff0c;旨在帮助想要了解QNX的读者及开发者可以快速阅读&#xff0c;而不必查看晦涩难懂的英文原文&#xff0c;这些文章将会作为一个…