数据结构,算法(一)--排序

排序

冒泡排序

两次for循环 一次循环可以将一个数据排好序,那两次for循环叠加就可以将整个数组的数据排好序。

//arr[i]>(<)arr[i+1] 交换
​
//走一轮用的代码
for(int i = 0;i<arr.length-1;i++){if(arr[i]>arr[i+1]){//交换//并且要注意  i<arr.length-1 因为交换条件是i+1 我们需要保证不溢出int temp = 0;temp = arr[i];arr[i]=arr[i+1];arr[i+1]=temp;}
}
//总代码
for(int j=0;j<arr.length;j++){for(int i = 0;i<arr.length-1;i++){if(arr[i]>arr[i+1]){//交换//并且要注意  i<arr.length-1 因为交换条件是i+1 我们需要保证不溢出int temp = 0;temp = arr[i];arr[i]=arr[i+1];arr[i+1]=temp;}
}
}

选择排序

游标 i 从左到右遍历数组,找到数组中最小值。让最小值和待排序数组中的第一位进行交换。

for(int j = 0;j<arr.length-1;j++){//等排到最后一个数字时,就已经排好顺序了,所以可以长度-1int min = arr[j];//先默认最小值是待排序数组中的第一个int index = j;//最小值的下标for(int i =j+1;i<arr.length;i++){//因为前面的已经排好序了,我们只要从待排的数据后一个开始排序。if(arr[i]<min){min = arr[i];index = i;}}arr[index] = arr[j];arr[j] = min;
}

插入排序

//先令第一个元素有序,让i为第二个元素。i不断遍历,i的循环下套一个j的循环,j循环的目的是检测数组是否有序。如果无序,那么交换位置。
for(int i = 1;i<arr.length;i++){for(int j = i-1;j>=0;j--){if(arr[j]>arr[j+1]){int temp = arr[j];arr[j]=arr[j+1];arr[j+1] = arr[j];}}
}

希尔排序

//就是插入排序的升级版。先分块 再插入排序。
for(int gep = arr.length/2;gep>0;gep/=2) {//i保证的是对每个分块都进行排序for(int i = gep;i<arr.length;i++) {for(int j = i-gep;j>=0;j-=gep) {if(arr[j]>arr[j+gep]) {int temp =arr[j];arr[j]=arr[j+gep];arr[j+gep] =temp;}}}}

基数排序

package com.qcby;
​
import java.util.Arrays;
​
public class ShellSort {public static void main(String[] args) {int arr[] = new int[] {654,123,7,12,987,122,234,18,46,10};sort(arr);System.out.println(Arrays.toString(arr));}public static void sort(int[] arr) {//定义二维数组来当做桶int[][] bucket = new int[10][arr.length];//定义一个一维数组来当做统计数据记录器int[] count = new int[10];//找到数组当中的最大数int max = arr[0];for(int i = 0;i<arr.length;i++) {if(arr[i] > max) {max = arr[i];}}//得到最大值的位数int maxLength = (max + "").length();int n = 1;for(int h = 0;h<maxLength;h++) {for(int i = 0;i<arr.length;i++) {int element = arr[i] / n % 10;  //读取出每个数组个位的值int num = count[element];  //根据个位的值的值找到桶内有多少数据bucket[element][num] = arr[i]; //将数据放入到桶当中count[element] = count[element]+1; //数据记录器响应位置+1}//将数据取出int index = 0;for(int k = 0; k<10;k++){if(count[k]!=0){for(int l = 0; l<count[k];l++){arr[index] = bucket[k][l];index++;}count[k] = 0;  //清空桶记录器}}n= n * 10;}}
}
​

归并排序

public void mergeSort(int[] arr, int low, int high) {// 递归结束条件:当low等于high时,表示已经只剩一个元素,不需要再继续递归划分了if (low < high) {// 计算中间位置,对左右两个子数组分别进行递归划分int mid = (low + high) / 2;mergeSort(arr, low, mid);mergeSort(arr, mid + 1, high);// 将左右两个有序子数组合并为一个有序数组merge(arr, low, mid, high);}
}
​
/*** 合并左右两个有序子数组为一个新的有序数组* @param arr 原数组* @param low 左子数组的起始位置* @param mid 左子数组的结束位置,同时也是右子数组的起始位置-1* @param high 右子数组的结束位置*/
public void merge(int[] arr, int low, int mid, int high) {// 新建一个临时数组来存储排序后的结果int[] temp = new int[high - low + 1];int i = low; // 左子数组起始位置int j = mid + 1; // 右子数组起始位置int k = 0; // 临时数组的下标// 将左右两个子数组中较小的元素依次放入临时数组中while (i <= mid && j <= high) {if (arr[i] <= arr[j]) {temp[k++] = arr[i++];} else {temp[k++] = arr[j++];}}// 如果左子数组还有剩余,则将其全部复制到临时数组中while (i <= mid) {temp[k++] = arr[i++];}// 如果右子数组还有剩余,则将其全部复制到临时数组中while (j <= high) {temp[k++] = arr[j++];}// 将临时数组中的元素复制回原数组中for (int p = 0; p < temp.length; p++) {arr[low + p] = temp[p];}
}

快速排序

package com.qcby;
​
import java.util.Arrays;
​
public class QuickSort {public static void main(String[] args) {int arr[] = new int[] {5,7,4,2,0,3,1,6};quickSort(arr, 0, arr.length-1);System.out.println(Arrays.toString(arr));}public static void quickSort(int[] arr,int left,int right) {if(left >= right) {  // left > right   | left == rightreturn;}int base = arr[left];  //基准数int i = left;   //两个游标int j = right;//当 i 和  j 不相遇的时候,重复以下过程while(i != j) {while(arr[j]>=base && i<j) {j--;}while(arr[i]<=base && i<j) {i++;}//数据交换int temp = arr[i];arr[i] = arr[j];arr[j] = temp;}//相遇位置的数和基准数交换arr[left] = arr[i];arr[i] = base;quickSort(arr, left, i-1,i,j);quickSort(arr, i+1, right,i,j);}}
​

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

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

相关文章

博客摘录「 Python Web 开发简介」2024年4月10日

【深度之眼】【OpenCV】笔记汇总_opencv深度之眼笔记-CSDN博客

Linux操作系统中关于用户管理的操作

创建新用户 useradd 【选项】 用户名 在/etc/passwd中以追加的方式在passwd的最后一行添加用户信息。 可以使用命令tail -n 1/etc/passwd查看文件的最后一行内容。 ls /home/首先/home/这是普通用户的家目录&#xff0c; 在/home/下会有一个跟用户名同名的家目录&#xf…

《经典论文阅读2》基于随机游走的节点表示学习—Deepwalk算法

word2vec使用语言天生具备序列这一特性训练得到词语的向量表示。而在图结构上&#xff0c;则存在无法序列的难题&#xff0c;因为图结构它不具备序列特性&#xff0c;就无法得到图节点的表示。deepwalk 的作者提出&#xff1a;可以使用在图上随机游走的方式得到一串序列&#x…

荔枝派LicheePi 4A RISCV板子支持的好玩的AI模型

荔枝派LicheePi 4A 是基于 Lichee Module 4A 核心板的 高性能 RISC-V Linux 开发板&#xff0c;以 TH1520 为主控核心&#xff08;4xC9101.85G&#xff0c; RV64GCV&#xff0c;4TOPSint8 NPU&#xff0c; 50GFLOP GPU&#xff09;&#xff0c;板载最大 16GB 64bit LPDDR4X&…

给自己的机器人部件安装单目摄像头并实现gazebo仿真功能

手术执行器添加摄像头 手术执行器文件夹surgical_new内容展示如何添加单目摄像头下载现成的机器人环境文件启动仿真环境 手术执行器文件夹surgical_new内容展示 进入src文件夹下选择进入vision_obliquity文件夹 选择launch 有两个可用gazebo中rviz展示的launch文件&#xff0…

Github Coplit的认证及其在JetBrains中的使用

原文地址&#xff1a;Github Coplit的认证及其在JetBrains中的使用 - Pleasure的博客 下面是正文内容&#xff1a; 前言 今天分享一个可有可无的小技巧&#xff0c;水一篇文。 如标题所述&#xff0c;Github Coplit的认证及其在JetBrains中的使用 正文 介绍JetBrains JetBrain…

《经典论文阅读1》YouTubeDNN—基于深度学习的搜推系统开山之作

论文链接&#xff1a; https://static.googleusercontent.com/media/research.google.com/zh-CN//pubs/archive/45530.pdf全文由『说文科技』原创出品。版权所有&#xff0c;翻版必究。 这篇发表于2016年九月的文章&#xff0c;在搜索推荐仍然基于矩阵分解的时代&#xff0c;抛…

Github 2024-04-14开源项目日报 Top10

根据Github Trendings的统计,今日(2024-04-14统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量TypeScript项目3C++项目3Python项目2JavaScript项目1NSIS项目1Jupyter Notebook项目1非开发语言项目1项目化学习 创建周期:2538 天协议类型:M…

Go sync.RWMutex 使用示例

sync.RWMutex 是 Go 语言标准库中的读写互斥锁&#xff0c;适用于读多写少的并发场景。它允许同时有多个读取者&#xff08;读者&#xff09;访问共享资源&#xff0c;但只允许一个写入者&#xff08;作者&#xff09;独占访问。 下面是一个使用 sync.RWMutex 的示例&#xff…

聊聊jvm中内存模型的坑

jvm线程的内存模型 看图&#xff0c;简单来说线程中操作的变量是副本。在并发情况下&#xff0c;如果数据发生变更&#xff0c;副本的数据就变为脏数据。这个时候就会有并发问题。 参考&#xff1a;https://www.cnblogs.com/yeyang/p/12580682.html 怎么解决并发问题 解决的…

【1000个GDB技巧之】如何在远端服务器打开通过vscode动态观测Linux内核实战篇?

Step: 配置ssh的服务端host &#xff08;也可以直接在vscode中配置&#xff0c;忽略&#xff09; 主要步骤&#xff1a;在~/.ssh/config中添加服务端的host&#xff0c;以便vscode的remote中能够登录 详细配置过程参考兄弟篇文章&#xff1a;ssh config如何配置用host名替代ro…

【管理】推进五步法

推进五步法是一种常用的解决问题和推动工作的方法&#xff0c;通常用于团队协作、项目管理和决策过程中。这五个步骤是&#xff1a; 明确目标&#xff1a;首先确定工作的具体目标或问题的解决方向。目标应该具体、明确、可量化&#xff0c;并与团队共享。 分析现状&#xff1a…

Unity 人形骨骼动画模型嘴巴张开

最近搞Daz3D玩&#xff0c;导入后挂上动画模型嘴巴张开&#xff0c;其丑无比。 Google了一下&#xff0c;得知原因是Unity没有对下巴那根骨骼做控制&#xff0c;动画系统就会把它放到默认的位置&#xff0c;嘴巴就张开了。找到了3种解决办法。 1.移除动画中对下巴这个骨骼的转…

数据结构之排序了如指掌(三)

目录 题外话 正题 快速排序 Hoare法 Hoare法思路 Hoare法代码详解 挖坑法 挖坑法思路 挖坑法代码 前后指针法 前后指针法思路 前后指针法代码 小结 题外话 我们接着把没有写完的排序内容完成,快速排序其实大同小异,大家好好把思路整理一下 正题 快速排序 快速排序一…

蓝桥杯:握手问题和小球反弹问题

试题 A: 握手问题 本题总分&#xff1a; 5 分 【问题描述】 小蓝组织了一场算法交流会议&#xff0c;总共有 50 人参加了本次会议。在会议上&#xff0c; 大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手&#xff08;且仅有一次&#x…

论文笔记:Teach LLMs to Phish: Stealing Private Information from Language Models

iclr 2024 reviewer 评分 588 1 intro 提出了一种“神经网络钓鱼攻击” 一种新的针对在敏感用户数据上训练或finetune的LLMs的攻击向量攻击者将看似无害的投毒数据插入到模型的训练数据集中&#xff0c;以“教会LLMs进行钓鱼”&#xff0c;即诱导模型记住他人的个人身份信息&…

Linux(Ubuntu) 查看并删除使用【dpkg】安装的软件【mysql 8.3安装失败---原因调查】

目录 ■前言 ■查看安装的软件 ■删除安装的软件 正常删除&#xff08;dpkg -r xxxxName&#xff09; 问题解决&#xff1a;use --purge to remove them too ■其他调查信息 命令 图片1 图片2 图片3 图片4 ■前言 安装Mysql8.3失败 我的服务器-CSDN博客 ■查看安…

结合 react-webcam、three.js 与 electron 实现桌面人脸动捕应用

系列文章目录 React 使用 three.js 加载 gltf 3D模型 | three.js 入门React three.js 3D模型骨骼绑定React three.js 3D模型面部表情控制React three.js 实现人脸动捕与3D模型表情同步结合 react-webcam、three.js 与 electron 实现桌面人脸动捕应用 示例项目(github)&…

【linux深入剖析】深入理解软硬链接 | 动静态库的制作以及使用

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1.理解软硬链接1.1 操作观…

CCF区块链论文录用资讯--ICDE 2024

ICDE是CCF A类会议 (数据库&#xff0f;数据挖掘&#xff0f;内容检索) 其2024录用了8篇区块链论文 Database technology for Blockchains I Efficient Partial Order Based Transaction Processing for Permissioned Blockchains &#xff08;针对许可区块链的高效的基于偏序…