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

数据结构(Java实现)-排序


排序的概念
排序:所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的
在这里插入图片描述
内部排序:数据元素全部放在内存中的排序。
外部排序:数据元素太多不能同时放在内存中,根据排序过程的要求不能在内外存之间移动数据的排序。


插入排序
基本思想:
把待排序的记录按其关键码值的大小逐个插入到一个已经排好序的有序序列中,直到所有的记录插入完为止,得到一个新的有序序列 。
在这里插入图片描述

在这里插入图片描述
直接插入排序的特性总结:

  1. 元素集合越接近有序,直接插入排序算法的时间效率越高
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1),它是一种稳定的排序算法
  4. 稳定性:稳定

在这里插入图片描述
一个本身就稳定的排序 可以实现为不稳定
但是一个本身就不稳定的排序 不可能实现为稳定的排序


希尔排序( 缩小增量排序 )
希尔排序法的基本思想是:先选定一个整数,把待排序文件中所有记录分成多个组,所有距离为的记录分在同一组内,并对每一组内的记录进行排序。然后,取,重复上述分组和排序的工作。当到达gap=1时,所有记录在统一组内排好序。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

希尔排序的特性总结:

  1. 希尔排序是对直接插入排序的优化。
  2. 当gap > 1时都是预排序,目的是让数组更接近于有序。当gap == 1时,数组已经接近有序的了,这样就会很快。
  3. 希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算。我们就记为n^1.3
  4. 稳定性:不稳定

选择排序
基本思想:
每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


选择排序的第二种写法
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

有两个疑点
1.
在这里插入图片描述
2.当left等于right时,说明当前下标的左边已经排号,当前下标的右边也已经排好,那么当前下标的值一定是中间值
在这里插入图片描述
【直接选择排序的特性总结】

  1. 直接选择排序思考非常好理解,但是效率不是很好。实际中很少使用
  2. 时间复杂度:O(N^2)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

堆排序
它是通过堆来进行选择数据。
在这里插入图片描述

在这里插入图片描述

  1. 堆排序使用堆来选数,效率就高了很多。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(1)
  4. 稳定性:不稳定

冒泡排序
在这里插入图片描述

在这里插入图片描述


快速排序
快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法,其基本思想为:任取待排序元素序列中的某元素作为基准值,按照该排序码将待排序集合分割成两子序列,左子序列中所有元素均小于基准值,右子序列中所有元素均大于基准值,然后最左右子序列重复该过程,直到所有元素都排列在相应位置上为止。
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
上述为快速排序递归实现的主框架,发现与二叉树前序遍历规则非常像,同学们在写递归框架时可想想二叉树前序遍历规则即可快速写出来,后序只需分析如何按照基准值来对区间中数据进行划分的方式即可。


Hoare版
在这里插入图片描述
在这里插入图片描述


挖坑法
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


快速排序优化:
在这里插入图片描述

三数取中法选key,目的:将待排序数组分开,不要只有左边或者只有右边
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


递归到小的子区间时,可以考虑使用插入排序。因为这时的区间元素已经趋近于有序
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


快速排序非递归形式
采用栈
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


快速排序总结

  1. 快速排序整体的综合性能和使用场景都是比较好的,所以才敢叫快速排序
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(logN)
  4. 稳定性:不稳定

归并排序
基本思想
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治(Divide andConquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


非递归形式实现归并排序
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述


归并排序总结

  1. 归并的缺点在于需要O(N)的空间复杂度,归并排序的思考更多的是解决在磁盘中的外排序问题。
  2. 时间复杂度:O(N*logN)
  3. 空间复杂度:O(N)
  4. 稳定性:稳定

海量数据的排序问题
外部排序:排序过程需要在磁盘等外部存储进行的排序
前提:内存只有 1G,需要排序的数据有 100G
因为内存中因为无法把所有数据全部放下,所以需要外部排序,而归并排序是最常用的外部排序

  1. 先把文件切分成 200 份,每个 512 M
  2. 分别对 512 M 排序,因为内存已经可以放的下,所以任意排序方式都可以
  3. 进行 2路归并,同时对 200 份有序文件做归并过程(磁盘IO读写),最终结果就有序了

排序算法复杂度及稳定性分析

在这里插入图片描述


其他非基于比较排序
计数排序
思想:计数排序又称为鸽巢原理,是对哈希直接定址法的变形应用。 操作步骤:

  1. 统计相同元素出现次数
  2. 根据统计的结果将序列回收到原来的序列中
    在这里插入图片描述

在这里插入图片描述


基数排序
基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


桶排序


上述涉及的所有代码
Sort.java

import java.util.Arrays;
import java.util.Stack;/*** Created with IntelliJ IDEA.* Description:* User: Home-pc* Date: 2023-08-26* Time: 12:04*/
public class Sort {@Overridepublic String toString() {return "Sort{}";}public static void insertSort(int[] array ){for (int i =1; i < array.length; i++) {int temp=array[i];//记录当前的元素,准备随时插入,同时放置元素被覆盖掉int j=i-1;for (; j>=0; j--) {if(array[j]>temp){//当前j下标的元素后移array[j+1]=array[j];}else{break;}}array[j+1]=temp;//没有j下标的元素大,插入它的后面}}//public  static  void shell(int[] array,int gap){for (int i =gap; i < array.length; i++) {//这里的i++,可以针对每一个分组int temp=array[i];//记录当前的元素,准备随时插入,同时放置元素被覆盖掉int j=i-gap;for (; j>=0; j-=gap) {if(array[j]>temp){//当前j下标的元素后移array[j+gap]=array[j];}else{break;}}array[j+gap]=temp;//没有j下标的元素大,插入它的后面}}public static void shellSort(int[] array){int gap=array.length;while(gap>1){gap/=2;shell(array,gap);//这里在最后一定会进行一次gap=1的插入排序}}//public static void selectSort(int[] array){for(int i=0;i< array.length;i++){int minIndex=i;for (int j = i+1; j < array.length; j++) {if(array[j]<array[minIndex]){minIndex=j;}}swap(array,i,minIndex);}}private static void swap(int[] array,int i,int j){int temp=array[i];array[i]=array[j];array[j]=temp;}//public static void selectSort2(int[] array){int left=0;int right= array.length-1;while(left<right){int minIndex=left;int maxIndex=left;for (int i = left+1; i <=right; i++) {if(array[i]<array[minIndex]){minIndex=i;}if(array[i]>array[maxIndex]){maxIndex=i;}}swap(array,minIndex,left);if(left==maxIndex){maxIndex=minIndex;}swap(array,maxIndex,right);left++;right--;}}//public static void heapSort(int[] array){createBigHeap(array);int end= array.length-1;while(end>0){swap(array,end,0);shiftDown(array,0,end);end--;}}private static void createBigHeap(int[] array){for (int i = (array.length-1-1)/2; i>=0; i--) {shiftDown(array,i, array.length);}}private static void shiftDown(int[] array,int parent,int len){int child=parent*2+1;while(child<len){if(child+1<len && array[child]<array[child+1]){child=child+1;}if(array[child]>array[parent]){swap(array,child,parent);parent=child;child=parent*2+1;}else{break;}}}//public  static  void bubbleSort(int[] arrary){for (int i = 0; i < arrary.length-1; i++) {boolean flag=false;for (int j = 0; j < arrary.length-1-i; j++) {if(arrary[j]>arrary[j+1]){swap(arrary,j,j+1);flag=true;}}if(!flag){break;}}}//public static void quickSort(int[] array){quick(array,0,array.length-1);}private static void quick(int[] array,int start,int end){if(start>=end){return;}//直接插入排序优化if(end-start+1<=10){insertSortForQuick(array,start,end);return;}//三数取中优化int mid=threeNum(array,start,end);swap(array,mid,start);int pivot=parttion(array,start,end);//求出基准值,依次为中间值划分序列quick(array,start,pivot-1);//左数quick(array,pivot+1,end);//右数}public static void insertSortForQuick(int[] array,int left,int right ){for (int i =left+1; i <=right; i++) {int temp=array[i];//记录当前的元素,准备随时插入,同时放置元素被覆盖掉int j=i-1;for (; j>=left; j--) {if(array[j]>temp){//当前j下标的元素后移array[j+1]=array[j];}else{break;}}array[j+1]=temp;//没有j下标的元素大,插入它的后面}}private static int parttion1(int[] array,int left,int right){int i=left;int temp=array[left];//拿这个值和其它元素比较while(left<right){while(left<right && array[right]>=temp){//找到右边第一个比temp小的值right--;}while(left<right && array[left]<=temp){//找到左边第一个比temp大的值left++;}swap(array,left,right);//交换这两个值}swap(array,left,i);//交换某个中间值和temp的值,使得temp为真正的中间值return left;//返回这个中间位置的下标}//private static int parttion(int[] array,int left,int right){int temp=array[left];while(left<right){while(left<right && array[right]>=temp){right--;}array[left]=array[right];while(left<right && array[left]<=temp){left++;}array[right]=array[left];}array[right]=temp;return left;}//优化:三数取中private static int threeNum(int[] array,int left,int right){int mid=(left+right)/2;if(array[left]<array[right]){if(array[mid]<array[left]){return left;}else if(array[mid]>array[right]){return right;}else{return mid;}}else{if(array[mid]<array[right]){return right;}else if(array[mid]>array[left]){return  left;}else{return mid;}}}//非递归实现public static void quickSortByStack(int[] array){Stack<Integer> stack=new Stack<>();stack.push(array.length-1);//这里先push的右边,后push的左边stack.push(0);while(!stack.empty()){int left=stack.pop();int right=stack.pop();if(left>=right){//成立,说明该区间排序结束continue;}int index=parttion(array,left,right);stack.push(right);stack.push(index+1);stack.push(index-1);stack.push(left);}}//归并private static void merge(int[] array,int left,int mid,int right){//两个有序组合并为一个有序组int s1=left;int e1=mid;int s2=mid+1;int e2=right;//看似拆分为了两组,实际是一直在一个数组中进行的操作int[] tmpArr=new int[right-left+1];//用于存放合并后的数组int k=0;while(s1<=e1&&s2<=e2){//if(array[s1]<=array[s2]){//将s1放入数组中tmpArr[k++]=array[s1++];}else{tmpArr[k++]=array[s2++];}}while(s1<=e1){tmpArr[k++]=array[s1++];}while(s2<=e2){tmpArr[k++]=array[s2++];}for (int i = 0; i <k; i++) {array[i+left]=tmpArr[i];//tmpArr数组的首元素的下标不一定为0,但一定为left}}private static void mergeSortFunc(int[] array,int left,int right){if(left>=right){//最小拆分组的数量为1return;}int mid=(left+right)/2;mergeSortFunc(array,left,mid);mergeSortFunc(array,mid+1,right);//递归拆分至最小组,准备排序后合并merge(array,left,mid,right);}public static void mergeSort1(int[] array){mergeSortFunc(array,0,array.length-1);}//非递归归并public static void mergeSort(int[] array){int gap=1;while(gap<array.length){for (int i = 0; i <array.length; i+=gap*2) {int left=i;int mid=left+gap-1;int right=mid+gap;//mid和right可能越界,这里我们将其归置到一个数组中if(mid>=array.length){mid=array.length-1;}if(right>=array.length){right=array.length-1;}merge(array,left,mid,right);}gap*=2;}}//计数排序public static void countArray(int[] array){int maxVal=array[0];int minVal=array[0];for (int i = 0; i <array.length; i++) {//找到数组里的最大值和最小值if(array[i]<minVal){minVal=array[i];}if(array[i]>maxVal){maxVal=array[i];}}//建立一个计数的数组int range=maxVal-minVal+1;int[] count=new int[range];//遍历数组,做计数统计for (int i = 0; i <array.length; i++) {int val=array[i];count[val-minVal]++;}//遍历计数数组,并重写array数组的元素int index=0;for (int i = 0; i < count.length; i++) {int val=count[i];while(val!=0){array[index++]=i+minVal;val--;}}}
}

测试代码

import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;import java.util.Arrays;
import java.util.Random;/*** Created with IntelliJ IDEA.* Description:* User: Home-pc* Date: 2023-08-26* Time: 13:48*/
public class TestSort {public static void notOrderArray(int[] array){Random random=new Random();for (int i = 0; i < array.length; i++) {array[i]=random.nextInt(100);}}public static void testShellSort(int[] array){array=Arrays.copyOf(array,array.length);Sort.shellSort(array);System.out.println(Arrays.toString(array));}public static void testSelectSort(int[] array){array=Arrays.copyOf(array,array.length);Sort.selectSort(array);System.out.println(Arrays.toString(array));}public static void testSelectSort2(int[] array){array=Arrays.copyOf(array,array.length);Sort.selectSort2(array);System.out.println(Arrays.toString(array));}public static void testheapSort(int[] array){array=Arrays.copyOf(array,array.length);Sort.heapSort(array);System.out.println(Arrays.toString(array));}public static void testbubbleSort(int[] array){array=Arrays.copyOf(array,array.length);Sort.bubbleSort(array);System.out.println(Arrays.toString(array));}public static void testquickSort(int[] array){array=Arrays.copyOf(array,array.length);//long startTime=System.currentTimeMillis();Sort.quickSort(array);//long endTime=System.currentTimeMillis();System.out.println(Arrays.toString(array));//System.out.println("优化后排序时间"+(endTime-startTime));}public static void testquickSortByStack(int[] array){array=Arrays.copyOf(array,array.length);//long startTime=System.currentTimeMillis();Sort.quickSortByStack(array);//long endTime=System.currentTimeMillis();System.out.println(Arrays.toString(array));//System.out.println("优化后排序时间"+(endTime-startTime));}public static void testmergeSort(int[] array){array=Arrays.copyOf(array,array.length);//long startTime=System.currentTimeMillis();Sort.mergeSort(array);//long endTime=System.currentTimeMillis();System.out.println(Arrays.toString(array));//System.out.println("优化后排序时间"+(endTime-startTime));}public static void testcountArray(int[] array){array=Arrays.copyOf(array,array.length);//long startTime=System.currentTimeMillis();Sort.countArray(array);//long endTime=System.currentTimeMillis();System.out.println(Arrays.toString(array));//System.out.println("优化后排序时间"+(endTime-startTime));}public static void main(String[] args) {int[] array=new int[30];notOrderArray(array);System.out.println(Arrays.toString(array));testShellSort(array);notOrderArray(array);System.out.println(Arrays.toString(array));testSelectSort(array);notOrderArray(array);System.out.println(Arrays.toString(array));testSelectSort2(array);notOrderArray(array);System.out.println(Arrays.toString(array));testheapSort(array);notOrderArray(array);System.out.println(Arrays.toString(array));testbubbleSort(array);notOrderArray(array);System.out.println(Arrays.toString(array));testquickSort(array);notOrderArray(array);System.out.println(Arrays.toString(array));testquickSortByStack(array);System.out.println("我是分割线");notOrderArray(array);System.out.println(Arrays.toString(array));testmergeSort(array);System.out.println("我是分割线");notOrderArray(array);System.out.println(Arrays.toString(array));testcountArray(array);}
}
***

在这里插入图片描述


在这里插入图片描述


在这里插入图片描述


相关文章:

数据结构(Java实现)-排序

排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&#xff0c;若经过排序&#xff…...

C++------vector【STL】

文章目录 vector的介绍及使用vector的介绍vector的使用 vector的模拟实现 vector的介绍及使用 vector的介绍 1、vector是表示可变大小数组的序列容器。 2、就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问和数…...

Matlab(变量与文本读取)

目录 1.变量&#xff08;数据&#xff09;类型转换 1.1 字符 1.2 字符串 1.3 逻辑操作与赋值 2.Struct结构体数组 2.1函数的详细介绍&#xff1a; 2.1.1 cell2struct 2.1.1.1 垂直维度转换 2.1.1.2 水平维度转换 2.1.1.3 部分进行转换 2.1.2 rmfield 2.1.3 fieldnames(查…...

WebGPU学习(8)---使用RenderBundle

RenderBundle是什么 通常情况下&#xff0c;WebGPU每次绘制时都需要向RenderPassEncoder注册渲染命令。处理此绘图命令比 WebGL 内部执行的类似处理更快。但是&#xff0c;如果可以省略此命令注册过程&#xff0c;则可以能够更快地绘制。RenderBundle 就是实现这一点的。 Ren…...

【前端】常用功能合集

目录 js跳转到新标签打开PDF文件js每十个字符换行 es6用表达式或变量名作为对象的属性名 vuev-for插值、:style、:class父组件加载完后再加载子组件keep-alive缓存跨域请求第三方接口跨域请求之callback&#xff08;不建议&#xff09;读取本地文件浏览器播放提示音audio jquer…...

chatgpt谈论日本排放污水事件

W...Y的主页 &#x1f60a; 代码仓库分享 &#x1f495; 近日&#xff0c;世界发生了让人义愤填膺的时间——日本排放核污水。这件事情是那么的突然且不计后果&#xff0c;海洋是我们全人类共同的财产&#xff0c;而日本却想用自己一己私欲将全人类的安全置之度外&#xff0c…...

Linux 查看当前目录大小

分析&回答 1. 查看当前目录下所有目录及子目录大小 du -h - . “.”代表当前目录下。也可以换成一个明确的路径 复制代码 2.查看当前文件目录各个文件夹大小 du -h --max-depth1 复制代码 查看指定目录 du -h --max-depth1 /path 复制代码 -h表示用K、M、G的人性化形…...

操作系统备考学习 day1 (1.1.1-1.3.1)

操作系统备考学习 day1 计算机系统概述操作系统的基本概念操作系统的概念、功能和目标操作系统的四个特征并发共享虚拟异步 操作系统的发展和分类操作系统的运行环境操作系统的运行机制 年初做了一个c的webserver 的项目&#xff0c;在学习过程中已经解除部分操作系统的知识&am…...

HTTP:http上传文件的原理及java处理方法的介绍

为了说明原理&#xff0c;以下提供一个可以上传多个文件的例子&#xff0c;html页面代码如下&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"UTF-8"> <title>http upload file</title> </head> <body>…...

[实习笔记] 字符串练习 (将大量的字符串用int值编码,然后通过int值二分快速查找某个字符串)

目录 介绍分析完整代码&#xff1a; 免责声明&#xff1a; 本文章是实习期间的C练习题目&#xff0c;可能会存在大量错误&#xff0c;文章仅作为个人笔记供作者自己方便观看. 介绍 在一个游戏里&#xff0c;可能会出现大量的NPC, 这些NPC有很多都是相同的名字. 存放NPC名字的…...

EMC VNX2代一键关机方法

由于不正确的EMC VNX存储系统的关机导致客户业务中断&#xff0c;数据丢失的案例数不胜数。不正确的关机顺序&#xff0c;很容易造成内存中的数据丢失&#xff0c;进而导致dirty cache&#xff0c;然后系统的LUN和POOL就无法online&#xff0c;业务中断。本文仅仅对EMC 2代产品…...

提升系统管理:监控和可观察性在DevOps中的作用

在不断发展的DevOps世界中&#xff0c;深入了解系统行为、诊断问题和提高整体性能的能力是首要任务之一。监控和可观察性是促进这一过程的两个关键概念&#xff0c;为系统的健康和性能提供了宝贵的可见性。虽然这些术语经常可以互换使用&#xff0c;但它们代表着理解和管理复杂…...

IIS搭建本地电脑服务器:通过内网穿透技术实现公网访问的步骤指南

1.前言 在网上各种教程和介绍中&#xff0c;搭建网页都会借助各种软件的帮助&#xff0c;比如网页运行的Apache和Nginx、数据库软件MySQL和MSSQL之类&#xff0c;为方便用户使用&#xff0c;还出现了XAMPP、PHPStudy、宝塔面板等等一系列集成服务&#xff0c;都是为了方便我们…...

Linux系统中驱动入门设备树DTS(经典)

设备树&#xff08;DTS:device tree source&#xff09;&#xff0c;字面意思就是一块电路板上设备如上图中CPU、DDR、I2C、GPIO、SPI等&#xff0c;按照树形结构描绘成的一棵树。按照策略和功能分离的思路&#xff0c;就是驱动代码&#xff08;功能&#xff09;和设备树DTS配置…...

关系型数据库与非关系型数据库类比

关系型数据库和非关系型数据库都有多种不同类型&#xff0c;每种类型都针对不同的数据存储需求和使用场景。以下是一些常见的关系型数据库和非关系型数据库类型&#xff1a; 关系型数据库类型&#xff1a; MySQL&#xff1a; 一种开源的关系型数据库管理系统&#xff0c;用于处…...

Ubuntu入门03——Ubuntu用户操作

1.Ubuntu如何进入root用户 进入ROOT用户的指令&#xff1a; Linux用su命令来切换用户&#xff1a; su root执行命令后&#xff0c;会提示你输入密码&#xff0c;而Ubuntu是没有设置root初始密码的。 若su命令不能切换root&#xff0c;提示su: Authentication failure&#x…...

输出图元(四)8-1 图元、屏幕坐标、指定二维世界坐标系统

用于图形应用的通用软件包称为计算机图形应用编程接口(CCAPI)它提供可以在C等程序设计语言中用来创建图形的函数库。如第3 章所指出的&#xff0c;函数库可以分成几种类型。创建图形时最先要做的一件事就是要描述显示场景的组成部分。图形的组成部分可以是树木和地形家具和墙壁…...

机器学习---决策树的划分依据(熵、信息增益、信息增益率、基尼值和基尼指数)

1. 熵 物理学上&#xff0c;熵 Entropy 是“混乱”程度的量度。 系统越有序&#xff0c;熵值越低&#xff1b;系统越混乱或者分散&#xff0c;熵值越⾼。 1948年⾹农提出了信息熵&#xff08;Entropy&#xff09;的概念。 从信息的完整性上进⾏的描述&#xff1a;当系统的有序…...

java解析json

1. 解析根节点为“{}”的json {"id": 1525490,"name": "有缘网" }代码&#xff1a; String jsonString "{\"id\":1525490\",\"name\":\"有缘网\"}";JSONObject jsonObject JSONObject.…...

PAT 1163 Dijkstra Sequence

个人学习记录&#xff0c;代码难免不尽人意。 Dijkstra’s algorithm is one of the very famous greedy algorithms. It is used for solving the single source shortest path problem which gives the shortest paths from one particular source vertex to all the other v…...

7.4.分块查找

一.分块查找的算法思想&#xff1a; 1.实例&#xff1a; 以上述图片的顺序表为例&#xff0c; 该顺序表的数据元素从整体来看是乱序的&#xff0c;但如果把这些数据元素分成一块一块的小区间&#xff0c; 第一个区间[0,1]索引上的数据元素都是小于等于10的&#xff0c; 第二…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

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;可…...

ESP32 I2S音频总线学习笔记(四): INMP441采集音频并实时播放

简介 前面两期文章我们介绍了I2S的读取和写入&#xff0c;一个是通过INMP441麦克风模块采集音频&#xff0c;一个是通过PCM5102A模块播放音频&#xff0c;那如果我们将两者结合起来&#xff0c;将麦克风采集到的音频通过PCM5102A播放&#xff0c;是不是就可以做一个扩音器了呢…...

CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云

目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包

文章目录 现象&#xff1a;mysql已经安装&#xff0c;但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时&#xff0c;可能是因为以下几个原因&#xff1a;1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中&#xff0c;集合判空是一个常见但容易出错的场景。传统方式虽然可行&#xff0c;但存在一些潜在问题&#xff1a; // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...