数据结构小测试:排序算法
目录
1、请简述数据结构八大排序算法的思路。
2、常用排序算法手写
冒泡排序:
选择排序:
快速排序:
归并排序:
堆排序:
3、额外再加一个二分查找吧
1、请简述数据结构八大排序算法的思路。
冒泡排序:将相邻元素之间的比较和交换,使得每一轮比较后,最大的元素能够到达数组的末尾。重复这个过程,直到整个数组有序。
选择排序:在每一轮中,找到数组中最小的元素,并将其与当前轮的第一个元素交换位置。重复这一操作,使得每一轮过后,都有一个元素被放到了正确的位置上。
插入排序:将数组分为已排序部分和未排序部分,每次从未排序部分取出一个元素,插入到已排序部分的正确位置上。
希尔排序:首先确定一个间隔序列,按此间隔将数组元素分组并进行插入排序。随后逐渐缩小间隔并重复排序过程,直到间隔为1。
快速排序:选一个基准元素,通过一趟排序将整体数据分割成两部分,基准元素左边的数据比基准元素小,右边的数据比基准元素大,然后再按此方法对这两部分数据分别进行快速排序,递归进行,直至完成。
归并排序:先将数组分成两半,分别对这两半进行排序,然后将它们合并成一个有序数组。重复递归这一操作,直至数组有序
堆排序:将待排序的序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根节点。将其与末尾元素进行交换,此时末尾就为最大值。然后将剩余n-1个序列重新构造成一个堆,这样会得到n个元素中的次大值。重复以上操作。
计数排序:对输入数据中的每个元素进行计数,确定每个元素出现的次数;然后利用计数结果将元素放到输出序列的正确位置上。
2、常用排序算法手写
冒泡排序:
将相邻元素之间的比较和交换,使得每一轮比较后,最大的元素能够到达数组的末尾。重复这个过程,直到整个数组有序。时间复杂度:O(n^2)
代码:
public static void sort(int[] arr) {for(int j=0;j<arr.length;j++) {for(int i=0;i<arr.length-1-j;i++) {if(arr[i]>arr[i+1]) {int temp=arr[i];arr[i] =arr[i+1];arr[i+1]=temp;}}}}
选择排序:
在每一轮中,找到数组中最小的元素,并将其与当前轮的第一个元素交换位置。重复这一操作,使得每一轮过后,都有一个元素被放到了正确的位置上。 时间复杂度:O(nlogn)
代码:
public static void simpleswap(int[] arr) {for(int i=0; i<arr.length; i++) { //负责遍历索引int index =i ;//index负责找最小的索引for(int j=i+1; j<arr.length; j++) { //负责找剩余元素中的最小值if(arr[j]<arr[index]) {index = j;}}//每找到一次就与前面的交换一次if(i != index){int temp = arr[index];arr[index] = arr[i];arr[i] = temp;}}
}
快速排序:
选一个基准元素,通过一趟排序将整体数据分割成两部分,基准元素左边的数据比基准元素小,右边的数据比基准元素大,然后再按此方法对这两部分数据分别进行快速排序,递归进行,直至完成。
时间复杂度:O(nlogn)
代码:
public static void quicksort(int[] arr,int left,int right) {//递归出口if(left>=right) {return;}//定义变量保存基准数int base=arr[left];//定义j游标指向最右边int j=right;//定义i游标指向最左边int i=left;while(i!=j) {//j从后往前找比基准数小的while(arr[j]>=base&&i<j) {j--;}//i从前往后找比基准数大的while(arr[i]<=base&&i<j) {i++;}//i、j两数都停下,交换位置int temp=arr[i];arr[i]=arr[j];arr[j]=temp;}//i和j相等(跳出循环)//交换基数和ij相遇位置的数据arr[left]=arr[i];arr[i]=base;//排序基准数的左边quicksort(arr,left,i-1);//排序基准数的右边quicksort(arr,i+1,right);}
归并排序:
先将数组分成两半,分别对这两半进行排序,然后将它们合并成一个有序数组。重复递归这一操作,直至数组有序。时间复杂度:O(nlogn)
底层逻辑:先拆分,拆到不能再拆分,然后进行合并,合并的时候进行排序


代码:
public class MergeSort {public static void main(String[] args) {int[] nums = new int[] { 9, 8, 7, 6, 5, 4, 3, 2, 10 };int[] newNums = mergeSort(nums, 0, nums.length - 1);System.out.println(Arrays.toString(newNums));}public static int[] mergeSort(int[] nums, int left, int right) {if (left == right)//已经拆分彻底,拆分递归的终止条件return new int[] { nums[left] };//拆分int mid = left + (right - left) / 2;int[] leftArr = mergeSort(nums, left, mid); //左有序数组int[] rightArr = mergeSort(nums, mid + 1, right); //右有序数组int[] newNum = new int[leftArr.length + rightArr.length]; //新有序数组//合并,将拆分的数按大小放到新有序数组里面int m = 0, i = 0, j = 0;while (i < leftArr.length && j < rightArr.length) {newNum[m++] = leftArr[i] < rightArr[j] ? leftArr[i++] : rightArr[j++];}while (i < leftArr.length)newNum[m++] = leftArr[i++];while (j < rightArr.length)newNum[m++] = rightArr[j++];return newNum;}
}
堆排序:
利用完全二叉树构建大顶堆,此时,整个序列的最大值就是堆顶的根节点。
将堆顶元素与堆底元素进行交换,此时堆底元素就为最大值。
然后将剩余n-1个序列重新构造成一个大顶堆。重复以上操作。
时间复杂度:O(nlogn)
大顶堆:父节点的值大于等于其左右孩子的值 等价于 arr[i]>=arr[2i+1] && arr[i]>=arr[2i+2]
流程图示:

构建大顶堆:

堆顶元素与堆底元素交换,堆底元素不再参与构建,剩下的再次重新构建大顶堆、交换
这一次重新构建时,直接让parent指向堆顶元素,再判断即可

java代码:
public class 堆排序 {public static void main(String[] args) {// TODO Auto-generated method stubint[] arr= {5,7,4,2,0,3,1,6};//1、构建大顶堆for(int i=arr.length-1;i>=0;i--) {//从下往上,每个节点以此判断为大顶堆;从length-1节点到0节点adjust(arr,i,arr.length);}System.out.println(Arrays.toString(arr));//输出第一次构建的大顶堆//2、堆顶堆底元素交换,除堆底外其余元素继续构建大顶堆for(int j=arr.length-1;j>=0;j--) {int temp=arr[j];arr[j]=arr[0];arr[0]=temp;//System.out.println(Arrays.toString(arr));//剩余元素继续构建大顶堆adjust(arr,0,j);//parent游标直接指向堆顶元素即可,最后一个元素不再参与构建//System.out.println(Arrays.toString(arr));}System.out.println(Arrays.toString(arr));}public static void adjust(int[] arr,int parent,int length) {int child = parent*2+1;//定义左孩子while(child<length) {//如果有孩子节点int rchild=child+1;//定义右孩子//这部分单纯为了让child指向最大childif(rchild<length && arr[child]<arr[rchild]) {//如果有右孩子,且右孩子比较大child++;//child指向较大的孩子节点(右孩子节点)}//如果父节点小于其孩子节点if(arr[parent]<arr[child]) {int temp=arr[parent];arr[parent]=arr[child];arr[child]=temp;//父子结点交换后parent指向childparent=child;child=2*parent+1;//再次进行循环比较}else {//如果该parent没有孩子节点或者父节点大于孩子节点,直接返回,此节点判断完毕break;}}}}
3、额外再加一个二分查找吧
时间复杂度:O(logn)
代码:
public class 二分查找 {public static void main(String[] args) {// TODO Auto-generated method stubint[] arr= {3,45,56,57,67,88};System.out.println(search(arr,11));}public static int search(int[] arr,int target) {int left = 0;int right = arr.length-1;while(left<=right) {int middle = (left+right)/2;if(target==arr[middle]) {System.out.println("找到了");return middle;}else if(target<arr[middle]){right=middle-1;}else {left=middle+1;}}System.out.println("没有这个数据");return -1;}}
相关文章:
数据结构小测试:排序算法
目录 1、请简述数据结构八大排序算法的思路。 2、常用排序算法手写 冒泡排序: 选择排序: 快速排序: 归并排序: 堆排序: 3、额外再加一个二分查找吧 1、请简述数据结构八大排序算法的思路。 冒泡排序ÿ…...
电脑远程开关机
1. 远程开机 参考:https://post.smzdm.com/p/664774/ 1.1 Wake On LAN - 局域网唤醒(需要主板支持,一般都支持) 要使用远程唤醒,有几种方式:使用类似向日葵开机棒(很贵)、公网ip&…...
# Redis 入门到精通(四)-- linux 环境安装 redis
Redis 入门到精通(四)-- linux 环境安装 redis 一、linux 环境安装 redis – 基于 Linux 安装 redis 1、基于 Center 0S7 或者 unbunt-18.04 安装 Redis 1)下载安装包wget http://download.redis.io/releases/redis-?.?.?.tar.gz 如&…...
SQL进阶技巧:如何按照固定尺寸(固定区间)对数据进行打分类标签?
目录 0 问题引入 应用案例1 应用案例2 小结 0 问题引入 在日常数据分析中,经常会遇到数据产品经理或数据分析师提出这样的需求,比如按照某一给定的区间或数据范围对数据进行分类标签,而遇到这样的问题,好多同学感觉SQL做起来有点困难或无从下手,其实面对这样的问题笔者…...
数学建模·灰色关联度
灰色关联分析 基本原理 灰色关联分析可以确定一个系统中哪些因素是主要因素,哪些是次要因素; 灰色关联分析也可以用于综合评价,但是由于数据预处理的方式不同,导致结果 有较大出入 ,故一般不采用 具体步骤 数据预处理…...
EMQX开源版安装
一、EMQX是什么 EMQX 是一款开源的大规模分布式 MQTT 消息服务器,功能丰富,专为物联网和实时通信应用而设计。EMQX 5.0 单集群支持 MQTT 并发连接数高达 1 亿条,单服务器的传输与处理吞吐量可达每秒百万级 MQTT 消息,同时保证毫秒…...
R语言进行集成学习算法:随机森林
# 10.4 集成学习及随机森林 # 导入car数据集 car <- read.table("data/car.data",sep ",") # 对变量重命名 colnames(car) <- c("buy","main","doors","capacity","lug_boot","safety"…...
虚拟机的状态更新
文章目录 虚拟机的更新一、检查虚拟机的配置1.已连接状态2. 保证镜像源挂载 二、进行更新三、其余事项 虚拟机的更新 虚拟机的更新是确保系统软件包和库的更新,以获得最新的修复和改进;如果长期没有打开单机或者集群,可以考虑先进行一次更新…...
基于hive数据库的泰坦尼克号幸存者数据分析
进入 ./beeline -u jdbc:hive2://node2:10000 -n root -p 查询 SHOW TABLES; 删除 DROP TABLE IF EXISTS tidanic; 上传数据 hdfs dfs -put train.csv /user/hive/warehouse/mytrain.db/tidanic 《泰坦尼克号幸存者数据分析》 1、原始数据介绍 泰坦尼克号是当时世界上…...
excel根据数据批量创建并重命名工作表
需求 根据一列数据,批量创建并重命名工作表 做法 1. 右键该sheet,选择查看代码 2. 输入VBA代码 正向创建 Sub create_sheets_by_col()Dim num% 定义为integer*num Application.WorksheetFunction.CountA(Sheet1.Range("A:A")) num是非空…...
智能合约和分布式应用管理系统:技术革新与未来展望
引言 随着区块链技术的不断发展,智能合约和分布式应用(DApps)逐渐成为数字经济中的重要组成部分。智能合约是一种自执行的协议,能够在预设条件满足时自动执行代码,而无需人工干预或中介机构。这种自动化和信任机制极大…...
Spring MVC 中的拦截器的使用“拦截器基本配置” 和 “拦截器高级配置”
1. Spring MVC 中的拦截器的使用“拦截器基本配置” 和 “拦截器高级配置” 文章目录 1. Spring MVC 中的拦截器的使用“拦截器基本配置” 和 “拦截器高级配置”2. 拦截器3. Spring MVC 中的拦截器的创建和基本配置3.1 定义拦截3.2 拦截器基本配置3.3 拦截器的高级配置 4. Spr…...
MyBatis框架学习笔记(四):动态SQL语句、映射关系和缓存
1 动态 SQL 语句-更复杂的查询业务需求 1.1 动态 SQL-官方文档 (1)文档地址: mybatis – MyBatis 3 | 动态 SQL (2)为什么需要动态 SQL 动态 SQL 是 MyBatis 的强大特性之一 使用 JDBC 或其它类似的框架,根据不同条…...
【C++PythonJava】字符处理详细解读_字符_ASCLL码_字母数字转换_算法竞赛_开发语言
文章目录 Beginning1)ASCLL 码2)大小比较2)判断数字字符3)字符、数字间的相互转换End Beginning 在 C 中,字符和整数有着密不可分的关系。原因就是在计算机中,字符是以一种较 ASCLL 码的整数存储的。自然&…...
人像视频淡入淡出效果的灵敏检验方法
在视频中经常会有淡入淡出的效果,这可能导致人脸检测在实际人已经离开画面之后仍然触发,特别是在使用基于像素强度变化的检测算法时。为了更精确地裁剪视频,你可以尝试以下几种方法: 使用更复杂的人脸检测模型: 有些…...
Unity UGUI Image Maskable
在Unity的UGUI系统中,Maskable属性用于控制UI元素是否受到父级遮罩组件的影响。以下是关于这个属性的详细说明和如何使用: Maskable属性 Maskable属性: 当你在GameObject上添加一个Image组件(比如UI面板或按钮)时&…...
SpringCloud | 单体商城项目拆分(微服务)
为什么要进行微服务拆分? 在平常的商城项目中,我们一般的项目结构模块都是将各种业务放在同一个项目文件夹,比如像: 用户,购物车,商品,订单,支付等业务都是放在一起,这样…...
uniapp 如何实现路由拦截,路由守卫
uniapp框架的全局文件:page.json全局文件,官网链接 背景: 通过封装 UniApp 的路由方法,并在封装方法中添加自定义逻辑,可以实现类似 Vue Router 的路由守卫功能。 在 UniApp 框架中,不像 Vue Router 直接支…...
人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解
大家好,我是微学AI,今天给大家介绍一下人工智能算法工程师(中级)课程13-神经网络的优化与设计之梯度问题及优化与代码详解。 文章目录 一、引言二、梯度问题1. 梯度爆炸梯度爆炸的概念梯度爆炸的原因梯度爆炸的解决方案 2. 梯度消失梯度消失的概念梯度…...
Qt/QML学习-ComboBox
QML学习 ComboBox例程视频讲解代码 main.qml import QtQuick 2.15 import QtQuick.Window 2.15 import QtQuick.Controls 2.15Window {width: 640height: 480visible: truetitle: qsTr("ComboBox")ComboBox {id: comboBox// 列表项数据模型model: ListModel {List…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用
文章目录 问题现象问题原因解决办法 问题现象 macOS启动台(Launchpad)多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显,都是Google家的办公全家桶。这些应用并不是通过独立安装的…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
VM虚拟机网络配置(ubuntu24桥接模式):配置静态IP
编辑-虚拟网络编辑器-更改设置 选择桥接模式,然后找到相应的网卡(可以查看自己本机的网络连接) windows连接的网络点击查看属性 编辑虚拟机设置更改网络配置,选择刚才配置的桥接模式 静态ip设置: 我用的ubuntu24桌…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
