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

排序(冒泡/快速/归并)

冒泡排序

  • 时间复杂度为 O(n^2)

  • 原理

    1. 比较相邻的元素. 如果第一个比第二个大,就交换他们两个.
    2. 依次比较每一对相邻的元素—>结果 : 最后的元素是这组数中最大的
    3. 重复上述步骤 , 除了最后一个[]因为最后一个已经是排好序的了(这组数中最大的那个)]
    4. 持续对越来越少的元素进行如上步骤 , 直到没有任何一对数字需要比较
  • 核心代码

public static void bubbleSort(int[] arr) {for(int i=0;i<arr.length-1;i++) {for(int j=0;j<arr.length-i-1;j++) {	//每次都少排最后一个if(arr[j]>arr[j+1]) {	//把大的往后放int t = arr[j];arr[j] = arr[j+1];arr[j+1] = t;}}}}

快速排序

  • 归并排序和快速排序都是基于“分而治之”的算法思想
public static int[] qSort(int arr[],int start,int end){int pivot = arr[start];    //一般定义arr数组的首元素为key值int i = start;   int j = end;while(i<j){//从左往右找,直到找到一个大于等于key值的while(i<j && arr[i]<pivot){i++;        } //从右往左找,直到找到一个小于等于key值的while(i<j && arr[j]>pivot){j—-;        }   if(i<j && arr[i]==arr[j]){    //如果两值相等,那么令左侧指针继续向后移i++;        }else{    //如果两值不同,就交换两值int t = arr[i];arr[i] = arr[j];arr[j] = t;        }}if(i-1>start) arr=qSort(arr,start,i-1);    //递归,将小于key值的那些排序。并将这部分排完序的数组(原数组的一部分)赋值给原数组if(j+1<end) arr=qSort(arr,j+1,end);        //递归,将大于key值的那些排序。同上return arr;
}

归并排序

  • 时间复杂度 :O(nlogn)
  • 速度仅次于快速排序
    归并 就是先将带排序的数组不断拆分,指导拆分到只剩一个元素的时候,这时我们再把他们合并为两个有序的数组,得到长度更长的有序数组。然后,按照这样的思路,一层一层的合并,直到整个数组有序。
  • 怎么合并?
    要借助一个和原数组等长的新数组(这也是个典型的 以空间换时间的 做法)
    在这里插入图片描述
    在这里插入图片描述
// import java.util.Arrays;public class Main{public static void main(String[] args){int[] arr = {1,4,3,7,14,6,10};// System.out.println(Arrays.toString(arr));sortArray(arr);for(int i=0;i<arr.length;i++){System.out.print(arr[i]+" ");}}//归并排序的入口public static int[] sortArray(int[] arr){//定义一个辅助数组tempint[] temp = new int[arr.length];//进行归并排序mergeSort(arr,0,arr.length-1,temp);//返回排好序的原数组return arr;}//归并排序//实现归并的'分'public static void mergeSort(int[] arr,int left,int right,int[] temp){//如果只有一个元素,就不需要继续划分(只有一个元素的区间,本来就是有序的)// if(left == right) return;//当left < right 说明该区间是由一组数组成,需要继续划分if(left < right){int mid = (left+right)/2;   //这段区间的中值,用来划分左右区域mergeSort(arr, left, mid, temp);    //递归划分左半区mergeSort(arr, mid+1, right, temp); //递归划分右半区//合并已经排序的部分(左半区和右半区)(从只有一个元素的区间开始)merge(arr,left,mid,right,temp);}}
//实现归并的'合'
//arr是原数组;left是左半区的起始位置;mid是左半区的结束位置;right是右半区的结束位置;temp是辅助数组public static void merge(int[] arr,int left,int mid,int right,int[] temp){int i = left;   //左半区的起始位置int j = mid+1;  //右半区的起始位置int k = left; //辅助数组的位置索引//合并//在左半区的位置索引范围内,和右半区的位置索引范围内,比较左右半区对应索引位置得的数值的大小,小的先放入temp数组中while(i<=mid && j<=right){//用三元运算符 更简洁 和下面的if else语句一个意思temp[k++] = arr[i] < arr[j] ? arr[i++] : arr[j++];/*if(arr[i]<arr[j])   //左半区剩余第一个元素更小temp[k++] = arr[i++];   //意思是:先让temp[h] = arr[i];再让k++,i++;else                //右半区剩余第一个元素更小temp[k++] = arr[j++];*/}//合并剩余元素(当其中一个半区的位置索引结束时,另一个半区可能还有剩余有序的元素--》直接合并到temp数组中即可)//合并左半区剩余元素while(i <= mid)temp[k++] = arr[i++];while(j <= right)temp[k++] = arr[j++];//temp数组 复制回 arr数组// for(int q=0;q<temp.length;q++){// arr[q] = temp[q];// }while(left <= right){arr[left] = temp[left];left++;}}
}

相关文章:

排序(冒泡/快速/归并)

冒泡排序 时间复杂度为 O(n^2) 原理 比较相邻的元素. 如果第一个比第二个大,就交换他们两个.依次比较每一对相邻的元素—>结果 : 最后的元素是这组数中最大的重复上述步骤 , 除了最后一个[]因为最后一个已经是排好序的了(这组数中最大的那个)]持续对越来越少的元素进行如上…...

jq中的跨域

跨域 1.从一个地址到另外一个第一请求资源或者数据时&#xff0c;就有可能发生跨域 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>跨域</title><script src"jquery/jquery-1.11.3.j…...

CUDA学习笔记08: 原子规约/向量求和

参考资料 CUDA编程模型系列一(核心函数)_哔哩哔哩_bilibili 代码 #include <iostream> #include <cuda_runtime.h> #include <device_launch_parameters.h> #include <stdio.h> #include <math.h>#define N 10000000 #define BLOCK 256 #def…...

PointNet++论文复现(一)【PontNet网络模型代码详解 - 分类部分】

PontNet网络模型代码详解 - 分类部分 专栏持续更新中!关注博主查看后续部分! 分类模型的训练: ## e.g., pointnet2_ssg without normal features python train_classification.py --model pointnet2_cls_ssg --log_dir pointnet2_cls_ssg python test_classification.py…...

AI渣土车监测报警摄像机

随着城市建设的不断发展和交通运输的快速增长&#xff0c;渣土车作为建筑行业中不可或缺的运输工具&#xff0c;承担着大量的渣土运输任务。然而&#xff0c;由于渣土车在运输过程中存在超速、违规变道、碾压行人等交通安全问题&#xff0c;给道路交通和行人安全带来了严重的隐…...

Spring框架介绍及详细使用

前言 本篇文章将会对spring框架做出一个比较详细的讲解&#xff0c;并且每个知识点基本都会有例子演示&#xff0c;详细记录下了我在学习Spring时所了解到全部知识点。 在了解是什么spring之前&#xff0c;我们要先知道spring框架在开发时&#xff0c;服务器端采用三层架构的方…...

【论文速读】| 对大语言模型解决攻击性安全挑战的实证评估

本次分享论文为&#xff1a;An Empirical Evaluation of LLMs for Solving Offensive Security Challenges 基本信息 原文作者&#xff1a;Minghao Shao, Boyuan Chen, Sofija Jancheska, Brendan Dolan-Gavitt, Siddharth Garg, Ramesh Karri, Muhammad Shafique 作者单位&a…...

小迪安全48WEB 攻防-通用漏洞Py 反序列化链构造自动审计 bandit魔术方法

#知识点&#xff1a; 1、Python-反序列化函数使用 2、Python-反序列化魔术方法 3、Python-反序列化 POP 链构造&#xff08;payload构造&#xff09; 4、Python-自动化审计 bandit 使用 #前置知识&#xff1a; 函数使用&#xff1a; pickle.dump(obj, file) : 将对…...

微服务:解放软件开发的神器,引领企业级应用的未来(二)

本系列文章简介&#xff1a; 本系列文章将深入剖析微服务架构的原理、设计和实践&#xff0c;向大家介绍微服务的核心概念和关键技术&#xff0c;以及在实际项目中的应用和实践经验。我们将通过具体的案例和实例&#xff0c;帮助大家理解微服务架构的优势和挑战&#xff0c;掌握…...

easyexcel与vue配合下载excel

后端 设置响应 // 设置响应头 response.setContentType("application/octet-stream;charsetUTF-8"); String returnName null; try {returnName URLEncoder.encode(fileName, "UTF-8"); } catch (UnsupportedEncodingException e) {throw new RuntimeExc…...

Vue.js 模板语法

Vue.js 使用了基于 HTML 的模板语法&#xff0c;允许开发者声明式地将 DOM 绑定至底层 Vue 实例的数据。 Vue.js 的核心是一个允许你采用简洁的模板语法来声明式的将数据渲染进 DOM 的系统。 结合响应系统&#xff0c;在应用状态改变时&#xff0c; Vue 能够智能地计算出重新…...

信号处理--基于DEAP数据集的情绪分类的典型深度学习模型构建

关于 本实验采用DEAP情绪数据集进行数据分类任务。使用了三种典型的深度学习网络&#xff1a;2D 卷积神经网络&#xff1b;1D卷积神经网络GRU&#xff1b; LSTM网络。 工具 数据集 DEAP数据 图片来源&#xff1a; DEAP: A Dataset for Emotion Analysis using Physiological…...

Spring设计模式-实战篇之模板方法模式

什么是模板方法模式&#xff1f; 模板方法模式用于定义一个算法的框架&#xff0c;并允许子类在不改变该算法结构的情况下重新定义算法中的某些步骤。这种模式提供了一种将算法的通用部分封装在一个模板方法中&#xff0c;而将具体步骤的实现延迟到子类中的方式。 模板方法模式…...

PTA天梯赛习题 L2-006 树的遍历

先序遍历&#xff1a;根-左-右 > 序列的第一个数就是根 中序遍历&#xff1a;左-根-右 > 知道中间某一个数为根&#xff0c;则这个数的左边就是左子树&#xff0c;右边则是右子树 后序遍历&#xff1a;左-右-根 > 序列的最后一个数就是根 题目 给定一棵…...

js相关的dom方法

查找元素 //获取元素id为box的元素 document.getElementById(box) //获取元素类名为box的元素 document.getElementsByClassName(box) //获取标签名为div的元素 document.getElementsByTagName(div)改变元素 //设置id为box的元素内容 document.getElementById("box"…...

Django——Ajax请求

Django——Ajax请求 一、响应 Json 数据 path(str/ , views.str_view), path(json/ , views.json_view), path(jsonresponse/ , views.jsonresponse_view), path(ls/ , views.ls),from django.shortcuts import render , HttpResponse from django.http import JsonResponse …...

基于java多角色学生管理系统论文

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本学生管理系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&am…...

python(django)之单一接口管理功能后台开发

1、创建数据模型 在apitest/models.py下加入以下代码 class Apis(models.Model):Product models.ForeignKey(product.Product, on_deletemodels.CASCADE, nullTrue)# 关联产品IDapiname models.CharField(接口名称, max_length100)apiurl models.CharField(接口地址, max_…...

教程1_图像视频入门

一、图像入门 1、cv2.imread()函数 cv2.imread() 是 OpenCV 库中的一个函数&#xff0c;用于读取图像文件。下面是 cv2.imread() 函数的基本介绍和使用方法&#xff1a; 函数定义 cv2.imread(filename, flagscv2.IMREAD_COLOR) 参数 filename&#xff1a;要读取的图像的路…...

MQTT.fx和MQTTX 链接ONENET物联网提示账户或者密码错误

参考MQTT.fx和MQTTX 链接ONENET物联网开发平台避坑细节干货。_mqttx和mqttfx-CSDN博客 在输入password和username后还是提示错误&#xff0c;是因为在使用token的时候&#xff0c;key填写错误&#xff0c;将设备的密钥填入key中...

地震勘探——干扰波识别、井中地震时距曲线特点

目录 干扰波识别反射波地震勘探的干扰波 井中地震时距曲线特点 干扰波识别 有效波&#xff1a;可以用来解决所提出的地质任务的波&#xff1b;干扰波&#xff1a;所有妨碍辨认、追踪有效波的其他波。 地震勘探中&#xff0c;有效波和干扰波是相对的。例如&#xff0c;在反射波…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

Leetcode 3577. Count the Number of Computer Unlocking Permutations

Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接&#xff1a;3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯&#xff0c;要想要能够将所有的电脑解锁&#x…...

srs linux

下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935&#xff0c;SRS管理页面端口是8080&#xff0c;可…...

css3笔记 (1) 自用

outline: none 用于移除元素获得焦点时默认的轮廓线 broder:0 用于移除边框 font-size&#xff1a;0 用于设置字体不显示 list-style: none 消除<li> 标签默认样式 margin: xx auto 版心居中 width:100% 通栏 vertical-align 作用于行内元素 / 表格单元格&#xff…...

大学生职业发展与就业创业指导教学评价

这里是引用 作为软工2203/2204班的学生&#xff0c;我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要&#xff0c;而您认真负责的教学态度&#xff0c;让课程的每一部分都充满了实用价值。 尤其让我…...

【C++进阶篇】智能指针

C内存管理终极指南&#xff1a;智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

一些实用的chrome扩展0x01

简介 浏览器扩展程序有助于自动化任务、查找隐藏的漏洞、隐藏自身痕迹。以下列出了一些必备扩展程序&#xff0c;无论是测试应用程序、搜寻漏洞还是收集情报&#xff0c;它们都能提升工作流程。 FoxyProxy 代理管理工具&#xff0c;此扩展简化了使用代理&#xff08;如 Burp…...

Linux安全加固:从攻防视角构建系统免疫

Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...