当前位置: 首页 > news >正文

数据结构与算法-排序算法

1.顺序查找

def linear_search(iters, val):for i, v in enumerate(iters):if v == val:return ireturn

2.二分查找

# 升序的二分查找
def binary_search(iters, val):left = 0right = len(iters)-1while left <= right:mid = (left + right) // 2if iters[mid] == val:return midelif iters[mid] > val:right = mid - 1else:left = mid + 1else:return
lis = [1, 2, 3, 4]
print(binary_search(lis, 2))# 降序的二分查找
def binary_search(iters, val):left = 0right = len(iters)-1while left <= right:mid = (left + right) // 2if iters[mid] == val:return midelif iters[mid] > val:left = mid + 1else:right = mid - 1else:return
lis = [4, 3, 2, 1]
print(binary_search(lis, 2))

3.冒泡排序

# 升序冒泡排序
def bubble_sort(li):for i in range(len(li)-1): #第i趟exchange = False # 判断第i趟是否进行了交换for j in range(len(li)-1-i):if li[j] > li[j+1]:li[j], li[j+1] = li[j+1], li[j]exchange = Trueprint(li)if not exchange:return
li = [1, 4, 2, 9, 0]
bubble_sort(li)print("===========================================")# 降序冒泡排序
def bubble_sort(li):for i in range(len(li)-1): #第i趟exchange = False # 判断第i趟是否进行了交换for j in range(len(li)-1-i):if li[j] < li[j+1]:li[j], li[j+1] = li[j+1], li[j]exchange = Trueprint(li)if not exchange:return
li = [1, 4, 2, 9, 0]
bubble_sort(li)

4.选择排序

# 升序选择排序: 非原地排序(新增一个变量存储排序后的结果)
def select_sort_sample1(li):li_new = []for i in  range(len(li)):min_val = min(li)li_new.append(min_val)li.remove(min_val)return li_new
li = [3, 1, 4, 7, 4, 8]
print(select_sort_sample1(li))print("================================================")# 降序选择排序: 非原地排序(新增一个变量存储排序后的结果)
def select_sort_sample2(li):new_li = []for i in range(len(li)):max_val = max(li)new_li.append(max_val)li.remove(max_val)return new_li
li = [3, 1, 4, 7, 4, 8]
print(select_sort_sample2(li))print("=================================================")# 升序选择排序: 原地排序
def select_sort1(li):for i in range(len(li)-1):min_loc = ifor j in range(i+1, len(li)):if li[j] < li[min_loc]:min_loc = jli[i], li[min_loc] = li[min_loc], li[i]print(li)
li = [1, 4, 2, 8, 5]
select_sort1(li)print("==================================================")# 降序选择排序: 原地排序
def select_sort2(li):for i in range(len(li)-1):max_loc = ifor j in range(i+1, len(li)):if li[j] > li[max_loc]:max_loc = jli[i], li[max_loc] = li[max_loc], li[i]print(li)
li = [1, 4, 2, 8, 5]
select_sort2(li)

5.插入排序

# 升序插入排序
def insert_sort1(li):for i in range(1, len(li)): #i表示摸到的牌的下标tmp = li[i] #存放待插入的牌j = i - 1 #j表示手里的牌的下标while j >= 0 and li[j] > tmp:li[j+1] = li[j]j -= 1li[j+1] = tmpprint(li)
li = [1, 4, 2, 8, 5]
insert_sort1(li)print("=======================================")# 降序插入排序
def insert_sort2(li):for i in range(1, len(li)):tmp = li[i]j = i - 1while j >= 0 and li[j] < tmp:li[j+1] = li[j]j -= 1li[j+1] = tmpprint(li)
li = [1, 4, 2, 8, 5]
insert_sort2(li)

6.快速排序

# 升序快速排序
def partition1(li, left, right):tmp = li[left] #存放待归位的值while left < right:while left < right and li[right] >= tmp: #从右面找比tmp小的元素right -= 1 #往左走一步li[left] = li[right] #把右边的值写到左边while left < right and li[left] <= tmp: #从左面找比tmp大的元素left += 1 #往右走一步li[right] = li[left] #把左边的值写到右边li[left] = tmpreturn leftdef quick_sort1(li, left, right):if left < right: #至少两个元素mid = partition1(li, left, right)quick_sort1(li, left, mid-1)quick_sort1(li, mid+1, right)li = [4, 3, 5, 5, 8, 7]
quick_sort1(li, 0, len(li)-1)
print(li)print("======================================================")# 降序快速排序
def partition2(li, left, right):tmp = li[left]while left < right:while left < right and li[right] <= tmp:right -= 1li[left] = li[right]while left < right and li[left] >= tmp:left += 1li[right] = li[left]li[left] = tmpreturn leftdef quick_sort2(li, left, right):if left < right:mid = partition2(li, left, right)quick_sort2(li, left, mid-1)quick_sort2(li, mid+1, right)li = [4, 3, 5, 5, 8, 7]
quick_sort2(li, 0, len(li)-1)
print(li)

7.堆排序

# 升序堆排序
def shift(li, low, high):# 建大根堆""":param li: 列表:param low: 堆的根节点位置:param high: 堆的最后一个元素位置:return:"""i = low #i最开始指向根节点j = 2 * i + 1 #j开始是左孩子tmp = li[low] #把堆顶存起来while j <= high: # j位置有效if j + 1 <= high and li[j+1] > li[j]: #如果右孩子有且比较大j = j + 1 #j指向右孩子if li[j] > tmp:li[i] = li[j]i = jj = 2 * i + 1else:li[i] = tmpbreakelse:li[i] = tmp # 把tmp放到叶子节点上def heap_sort(li):n = len(li)for i in range((n-2)//2, -1, -1):# (n - 2) // 2表示最后一个有孩子节点的节点的下标# i表示建堆的时候要进行调整的二叉树的根的下标shift(li, i, n-1)# 建堆完成print("大根堆:{}".format(li))for i in range(n-1, -1, -1):# i指向当前堆的最后一个元素li[0], li[i] = li[i], li[0]shift(li, 0, i-1) # i-1是最新的high
import random
li = [i for i in range(10)]
random.shuffle(li)
print("初始列表:{}".format(li))
heap_sort(li)
print("排序列表:{}".format(li))print("============================================")# 降序堆排序
def shift1(li, low, high):# 建小根堆""":param li: 列表:param low: 堆的根节点位置:param high: 堆的最后一个节点的位置:return:"""i = low # 最开始指向根节点j = 2 * i + 1 # 左孩子节点tmp = li[low]while j <= high:if j + 1 <= high and li[j + 1] < li[j]:j = j + 1if li[j] < tmp:li[i] = li[j]i = jj = 2 * i + 1else:li[i] = tmpbreakelse:li[i] = tmpdef heap_sort1(li):n = len(li)for i in range((n-2)//2, -1, -1):shift1(li, i, n-1)print("小根堆:{}".format(li))# 建堆完成for i in range(n-1, -1, -1):li[0], li[i] = li[i], li[0]shift1(li, 0, i - 1)
import random
li = [i for i in range(10)]
random.shuffle(li)
print("初始列表:{}".format(li))
heap_sort1(li)
print("排序列表:{}".format(li))

8.归并排序

# 升序归并排序
def merge(li, low, mid, high):# 对两个有序列表进行合并""":param li: 列表:param low::param mid::param high::return:"""i = lowj = mid + 1ltmp = []while i <= mid and j <= high: #只要两边都有数if li[i] < li[j]:ltmp.append(li[i])i += 1else:ltmp.append(li[j])j += 1while i <= mid:ltmp.append(li[i])i += 1while j <= high:ltmp.append(li[j])j += 1li[low:high+1] = ltmpdef merge_sort(li, low, high):if low < high: # 至少有两个元素mid = (low + high) // 2merge_sort(li, low, mid)merge_sort(li, mid + 1, high)merge(li, low, mid, high)import random
li = [i for i in range(10)]
random.shuffle(li)
merge_sort(li, 0, len(li) - 1)
print(li)print("================================================")# 降序归并排序
def merge1(li, low, mid, high):# 对两个有序列表进行合并""":param li: 列表:param low::param mid::param high::return:"""i = lowj = mid + 1ltmp = []while i <= mid and j <= high: #只要两边都有数if li[i] > li[j]:ltmp.append(li[i])i += 1else:ltmp.append(li[j])j += 1while i <= mid:ltmp.append(li[i])i += 1while j <= high:ltmp.append(li[j])j += 1li[low:high+1] = ltmpdef merge_sort1(li, low, high):if low < high: # 至少有两个元素mid = (low + high) // 2merge_sort1(li, low, mid)merge_sort1(li, mid + 1, high)merge1(li, low, mid, high)import random
li = [i for i in range(10)]
random.shuffle(li)
merge_sort1(li, 0, len(li) - 1)
print(li)

9.希尔排序

# 升序希尔排序
def insert_sort_gap(li, gap):for i in range(gap, len(li)): #i表示摸到的牌的下标tmp = li[i] #存放待插入的牌j = i - gap #j表示手里的牌的下标while j >= 0 and li[j] > tmp:li[j + gap] = li[j]j -= gapli[j+gap] = tmpdef shell_sort(li):d = len(li) // 2while d >= 1:insert_sort_gap(li, d)d //= 2li = [1, 4, 2, 8, 5]
shell_sort(li)
print(li)

10.计数排序

# 升序计数排序
# 限制: 数值有确定的范围
def count_sort(li, max_count=100):count = [0 for _ in range(max_count+1)]for val in li:count[val] += 1li.clear()for ind, val in enumerate(count):for i in range(val):li.append(ind)
import random
li = [random.randint(0, 100) for i in range(1000)]
count_sort(li)
print(li)

11.桶排序

# 升序桶排序
def bucket_sort(li, n=100, max_num=10000):buckets = [[] for i in range(n)]  # 创建桶for var in li:i = min(var // (max_num // n), n - 1)  # i表示var放到第几个桶里buckets[i].append(var)  # 把var放桶里for j in range(len(buckets[i]) - 1, 0, -1):if buckets[i][j] < buckets[i][j - 1]:buckets[i][j], buckets[i][j - 1] = buckets[i][j - 1], buckets[i][j]else:breaksorted_li = []for buc in buckets:sorted_li.extend(buc)return sorted_liimport random
li = [random.randint(0, 10000) for i in range(100)]
print(bucket_sort(li))

12.基数排序

def redix_sort(li):""":param li: 列表:return:限制于正整数的基数排序"""max_num = max(li)it = 0  # 0 -> 按个位分桶  1 -> 按十位分桶 2 -> 按百位分桶...while 10 ** it <= max_num:buckets = [[] for _ in range(10)]for var in li:digit = (var // 10 ** it) % 10  # it->0 取个位; it->1 取十位; it->2 取百位...(若该数位上没有数字, 取零)buckets[digit].append(var)# 分桶完成li.clear()for buc in buckets:li.extend(buc)# 把数重新写回liit += 1import random
li = [random.randint(0, 10000) for i in range(100)]
redix_sort(li)
print(li)

相关文章:

数据结构与算法-排序算法

1.顺序查找 def linear_search(iters, val):for i, v in enumerate(iters):if v val:return ireturn 2.二分查找 # 升序的二分查找 def binary_search(iters, val):left 0right len(iters)-1while left < right:mid (left right) // 2if iters[mid] val:return mid…...

SpringBoot 文件上传(三)

之前讲解了如何接收文件以及如何保存到服务端的本地磁盘中&#xff1a; SpringBoot 文件上传&#xff08;一)-CSDN博客 SpringBoot 文件上传&#xff08;二&#xff09;-CSDN博客 这节讲解如何利用阿里云提供的OSS&#xff08;Object Storage Service)对象存储服务保存文件。…...

web渗透测试漏洞流程:红队目标信息收集之资产搜索引擎收集

web渗透测试漏洞流程 渗透测试信息收集---域名信息收集1.域名信息的科普1.1 域名的概念1.2 后缀分类1.3 多重域名的关系1.4 域名收集的作用1.5 DNS解析原理1.6 域名解析记录2. 域名信息的收集的方法2.1 基础方法-搜索引擎语法2.1.1 Google搜索引擎2.1.1.1 Google语法的基本使用…...

UI自动化_id 元素定位

## 导包selenium from selenium import webdriver import time1、创建浏览器驱动对象 driver webdriver.Chrome() 2、打开测试网站 driver.get("你公司的平台地址") 3、使浏览器窗口最大化 driver.maximize_window() 4、在用户名输入框中输入admin driver.find_ele…...

华为OD技术面算法题整理

LeetCode原题 简单 题目编号频次409. 最长回文串 - 力扣(LeetCode)3...

vmware虚拟机下ubuntu扩大磁盘容量

1、扩容&#xff1a; 可以直接在ubuntu setting界面里直接扩容&#xff0c;也可通过vmware命令&#xff0c;如下&#xff1a; vmware提供一个命令行工具&#xff0c;vmware-vdiskmanager.exe&#xff0c;位于vmware的安装目录下&#xff0c;比如 C:/Program Files/VMware/VMwar…...

秋招打卡算法题第一天

一年多没有刷过算法题了&#xff0c;已经不打算找计算机类工作了&#xff0c;但是思来想去&#xff0c;还是继续找吧。 1. 字符串最后一个单词的长度 public static void main(String[] args) {Scanner in new Scanner(System.in);while(in.hasNextInt()){String itemin.nextL…...

BC98 序列中删除指定数字

题目 描述 有一个整数序列&#xff08;可能有重复的整数&#xff09;&#xff0c;现删除指定的某一个整数&#xff0c;输出删除指定数字之后的序列&#xff0c;序列中未被删除数字的前后位置没有发生改变。 数据范围&#xff1a;序列长度和序列中的值都满足 1≤&#xfffd;≤…...

基于Java的学生体质健康管理系统的设计与实现(论文+源码)_kaic

摘 要 随着时代的进步&#xff0c;信息化也在逐渐深入融进我们生活的方方面面。其中也给健康管理带来了新的发展方向。通过对学生体质健康管理的研究与分析发现当下的管理系统还不够全面&#xff0c;系统的性能达不到使用者的要求。因此&#xff0c;本文结合Java的优势和流行性…...

【Linux系统】冯诺依曼与操作系统

什么是冯诺依曼体系结构&#xff1f; 如图即为冯诺依曼大致的体系结构图&#xff0c; 我们知道这些都是由我们的计算机硬件组成 输入设备&#xff1a;键盘&#xff0c; 鼠标&#xff0c; 摄像头&#xff0c; 话筒&#xff0c; 磁盘&#xff0c; 网卡... 输出设备&#xff1a…...

前端理论总结(html5)——form表单的新增特性/h5的新特性

form表单的新增特性 range&#xff1a;范围 color&#xff1a;取色器 url&#xff1a;对url进行验证 tel&#xff1a;对手机号格式验证 email&#xff1a;对邮箱格式验证 novalidate &#xff1a;提交表单时不验证 form 或 input 域 numbe…...

基于TensorFlow的花卉识别(算能杯)%%%

Anaconda Prompt 激活 TensorFlow CPU版本 conda activate tensorflow_cpu //配合PyCharm环境 直接使用TensorFlow1.数据分析 此次设计的主题为花卉识别&#xff0c;数据为TensorFlow的官方数据集flower_photos&#xff0c;包括5种花卉&#xff08;雏菊、蒲公英、玫瑰、向日葵…...

Android实现一周时间早中晚排班表

我们要做一个可以动态添加,修改一周早中晚时间排班表&#xff0c;需求图如下&#xff1a; one two 过程具体在这里不描述了&#xff0c;具体查看&#xff0c;https://github.com/yangxiansheng123/WorkingSchedule 上传数据格式&#xff1a; {"friday_plan":"…...

【Java八股面试系列】中间件-Redis

目录 Redis 什么是Redis Redis解决了什么问题 Redis的实现原理 数据结构 String 常用命令 应用场景 List(列表) 常用命令 应用场景 Hash(哈希) 常用命令 应用场景 set(集合) 常见命令​编辑 应用场景 Sorted Set(有序集合) 常见命令​编辑 应用场景 数据持…...

目前国内体验最佳的AI问答助手:kimi.ai

文章目录 简介图片理解长文档解析 简介 kimi.ai是国内初创AI公司月之暗面推出的一款AI助手&#xff0c;终于不再是四字成语拼凑出来的了。这是一个非常存粹的文本分析和对话工具&#xff0c;没有那些东拼西凑花里胡哨的AIGC功能&#xff0c;实测表明&#xff0c;这种聚焦是对的…...

Visual Studio项目编译和运行依赖第三方库的项目

1.创建项目&#xff0c;这里创建的项目是依赖于.sln的项目&#xff0c;非CMake项目 2.添加第三方库依赖的头文件和库文件路劲 3.添加第三方依赖库文件 4.项目配置有2个&#xff0c;一个是Debug&#xff0c;一个是Release&#xff0c;如果你只配置了Debug&#xff0c;编译和运行…...

Rust 语言中 Vec 的元素的删除方法

在 Rust 中&#xff0c;Vec&#xff08;向量&#xff09;提供了多种删除元素的方法。以下是一些常用的删除方法&#xff1a; remove: 这是最常用的删除方法&#xff0c;它接受一个索引作为参数&#xff0c;并移除该索引处的元素&#xff0c;同时返回被移除的元素。所有后面的元…...

谈谈我对 AIGC 趋势下软件工程重塑的理解

作者&#xff1a;陈鑫 今天给大家带来的话题是 AIGC 趋势下的软件工程重塑。今天这个话题主要分为以下四大部分。 第一部分是 AI 是否已经成为软件研发的必选项&#xff1b;第二部分是 AI 对于软件研发的挑战及智能化机会&#xff0c;第三部分是企业落地软件研发智能化的策略…...

我在京东做数据分析,一位京东数据分析师的工作日常

有人说&#xff1a;“种下一棵树最好的时间是十年前&#xff0c;其次是现在”。任何时候&#xff0c;我们都应该抓住机遇&#xff0c;说不定就是改变你现状的一个机会。 2020年&#xff0c;我在疫情得到控制后&#xff0c;面试入职京东大数据组&#xff0c;截止目前&#xff0…...

数字乡村战略实施:科技引领农村经济社会全面发展

随着信息技术的快速发展&#xff0c;数字化已经成为推动经济社会发展的重要力量。在乡村振兴战略的大背景下&#xff0c;数字乡村战略的实施成为了引领农村经济社会全面发展的关键。本文将从数字乡村战略的内涵、实施现状、面临挑战及未来展望等方面&#xff0c;探讨科技如何引…...

栈与队列:数据结构的有序律动

在数据结构的舞台上&#xff0c;栈与队列宛如两位优雅的舞者&#xff0c;以独特的节奏演绎着数据的进出规则。它们虽不像顺序表与链表那般复杂多变&#xff0c;却有着令人着迷的简洁与实用&#xff0c;在众多程序场景中发挥着不可或缺的作用。今天&#xff0c;就让我们一同去探…...

【Net】TCP粘包与半包

文章目录 TCP粘包与半包1 背景2 粘包&#xff08;packet stick&#xff09;3 半包&#xff08;packet split&#xff09;4 为什么会出现粘包/半包&#xff1f;5 如何解决&#xff1f;6 示例7 总结 TCP粘包与半包 在网络编程中&#xff0c;粘包和半包问题是常见的 TCP 协议特有…...

复变函数 $w = z^2$ 的映射图像演示

复变函数 w z 2 w z^2 wz2 的映射图像演示 复变函数 w z 2 w z^2 wz2 是一个基本的二次函数&#xff0c;在复平面上具有有趣的映射性质。下面我将介绍这个函数的映射特性&#xff0c;并使用MATLAB进行可视化演示。 映射特性 极坐标表示&#xff1a;若 z r e i θ z …...

FreeBSD 14.3 候选版本附带 Docker 镜像和关键修复

新的月份已经到来&#xff0c;FreeBSD 14.3 候选发布版 1 现已开放测试&#xff0c;它带来了一些您可能会觉得有用的更新&#xff0c;特别是如果您对Docker容器感兴趣的话。RC1 版本中一个非常受欢迎的改进是&#xff0c;FreeBSD 项目已开始将官方开放容器计划 (OCI) 镜像发布到…...

CAN通讯协议中各种参数解析

1.各种参数缩写 2.多帧传输时间参数解析 - Sender&#xff08;左侧&#xff09; 指的是 多帧数据的发送者&#xff0c;也就是&#xff1a; ECU&#xff08;被测系统 / 响应方&#xff09; - Receiver&#xff08;右侧&#xff09; 指的是 多帧数据的接收者&#xff0c;也就是…...

PostgreSQL优化实践:从查询到架构的性能提升指南

## 引言 PostgreSQL作为先进的开源关系型数据库&#xff0c;在复杂查询处理与高并发场景中表现卓越&#xff0c;但不当的使用仍会导致性能瓶颈。本文系统性梳理优化路径&#xff0c;覆盖SQL编写、索引策略、参数调优等关键环节&#xff0c;配合代码示例与量化建议&#xff0c;…...

【Python 算法零基础 4.排序 ⑥ 快速排序】

既有锦绣前程可奔赴&#xff0c;亦有往日岁月可回首 —— 25.5.25 选择排序回顾 ① 遍历数组&#xff1a;从索引 0 到 n-1&#xff08;n 为数组长度&#xff09;。 ② 每轮确定最小值&#xff1a;假设当前索引 i 为最小值索引 min_index。从 i1 到 n-1 遍历&#xff0c;若找到…...

Dify案例实战之智能体应用构建(一)

一、部署dify Windows安装Docker部署dify&#xff0c;接入阿里云api-key进行rag测试-CSDN博客 可以参考我的前面文章&#xff0c;创建一个本地dify或者直接dify官网使用一样的&#xff08;dify官网需要科学上网&#xff09; 二、Dify案例实战之智能体 2.1 智能面试官 需求;…...

怎么快速判断一款MCU能否跑RTOS系统

最近有朋友在后台中私信我&#xff0c;说现在做项目的时候有时候总是会考虑要不要用RTOS&#xff0c;或者怎么考量什么时候该用RTOS比较好、 关于这个问题&#xff0c;我个人也是深有感触的&#xff0c;做开发这么久了&#xff0c;大大小小的产品都做过不少了。有用RTOS开发的…...

Java 面试中的数据库设计深度解析

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Java 面试中的数据库设计深度解析一、数据库…...