数据结构—排序

news2024/11/24 0:37:56

8.排序

8.1排序的概念

什么是排序?

  • 排序:将一组杂乱无章的数据按一定规律顺序排列起来。即,将无序序列排成一个有序序列(由小到大或由大到小)的运算。
    • 如果参加排序的数据结点包含多个数据域,那么排序往往是针对其中某个域而言。

排序方法的分类

  • 按存储介质可分为:

    • 内部排序:数据量不大、数据在内存,无需内外存交换数据

    • 外部排序:数据量较大、数据在外存(文件排序)

      ​ 外部排序时,要将数据分批调入内存在排序,中间结果还要及时放入外存,显然外部排序要复杂得多。

  • 按比较器个数可分为:

    • 串行排序:单处理机(同一时刻比较一对元素)
    • 并行排序:多处理机(同一时刻比较多对元素)
  • 按主要操作可分为:

    • 比较排序:用比较的方法

      ​ 插入排序、交换排序、选择排序、归并排序

    • 基数排序:不比较元素的大小,仅仅根据元素本身的取值确定其有序位置。

  • 按辅助空间可分为:

    • 原地排序:辅助空间用量为O(1)的排序方法。

      ​ (所占的辅助存储空间与参加排序的数据量大小无关)

    • 非原地排序:辅助空间用量超过O(1)的排序方法。

  • 按稳定性可分为:

    • 稳定排序:能够使任何数值相等的元素,排序以后相对次序不变。
    • 非稳定性排序:不是稳定排序的方法。
  • 按自然性可分为:

    • 自然排序:输入数据越有序,排序的速度越快的排序方法。
    • 非自然排序:不是自然排序的方法。

存储结构——记录序列以顺序表存储

#define MAXSIZE 20
typedef int KeyType;//设关键字为整型量(int型)
Typedef struct{//定义每个记录(数据元素)的结构
  KeyType key;//关键字
  InfoType otherinfo;//其他数据项
}RedType;
Typedef struct{//定义顺序表的结构
  RedType r[MAXSIZE+1];//存储顺序表的向量
  int length;//r[0]一般作哨兵或缓冲区
}SqList;

8.2插入排序

基本思想:每一步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。

即边插遍排序,保证子序列中随时都是排好序的

基本操作:有序插入

  • 在有序序列中插入一个元素,保持序列有序,有序长度不断增加。
  • 起初,a[0]是长度为1的子序列。然后,逐一将a[1]至a[n-1]插入到有序子序列中。

有序插入方法

  • 在插入a[i]前,数组a的前半段(a[0]~a[i-1])是有序段,后半段(a[i] ~a[n-1])是停留于输入次序的无序段。
  • 在插入a[i]使a[0]~a[i-1]有序,也就是要为a[i]找到有序位置j(0≤j≤i),将a[i]插入在a[j]的位置上。

插入排序的种类:

​ 顺序法定位插入位置————直接插入排序

​ 二分法定位插入位置————二分插入排序

​ 缩小增量多遍插入排序————希尔排序

8.2.1直接插入排序

  • 直接插入排序——采用顺序查找法查找插入位置

数据结构(23)--排序篇之插入排序_咕叽咕叽小菜鸟的博客-CSDN博客

  1. 复制插入元素
  2. 记录后移,查找插入位置
  3. 插入到正确位置
x=a[i];
for(j=i-1;j>=0&&x<a[j];j--)
  a[j+1]=a[j];
a[j-1]=x;
  • 直接插入排序,使用“哨兵”

直接插入排序 - 知乎

  1. 复制为哨兵
  2. 记录后移,查找插入位置
  3. 插入到正确位置
L.r[0]=L.r[i];
for(j=i-1;L.r[0].key<L.r[j].key;--j)
  L.r[j+1]=L.r[j];
L.r[j+1]=L.r[0];
void InsertSort(SqList &L){
  int i,j;
  for(i=2;i<=L.length;++i){
    if(L.r[i].key<L.r[i-1].key){//若“<”,需将L.r[i]插入有序子表
      L.r[0]=L.r[i];//复制为哨兵
      for(j=i-1;L.r[0].key<L.r[j].key;--j){
        L.r[j+1]=L.r[j];//记录后移
      }
      L.r[j+1]=L.r[0];//插入到正确位置
    }
  }
}

实现排序的基本操作有两个:

  1. 比较序列中两个关键字的大小;
  2. 移动记录。

直接插入排序在什么情况下效率比较高?

​ 直接插入排序在基本有序时,效率较高

​ 在待排序的记录个数较少时,效率较高

8.2.2折半插入排序

查找插入位置时采用折半查找法

折半插入排序_zhangvalue的博客-CSDN博客

void BInsertSort(SqList &L){
  for(i=2;i<=L.length;++i){//依次插入第2~第n个元素
    L.r[0]=L.r[i];//当前插入元素存到“哨兵”位置
    low=1;
    high=i-1;
    while(low<=high){
      mid=(mid+high)/2;
      if(L.r[0].key<L.r[mid].key)high=mid-1;
      else low=mid+1;
    }//循环结束,high+1则为插入位置
    for(j=i-1;j>=high+1;--j)
      L.r[j+1]=L.r[j];
    L.r[high+1]=L.r[0];
  }
}

算法分析

  • 折半查找比顺序查找快,所以折半插入排序就平均性能来说比直接插入排序要快;
  • 它所需要的关键码比较次数与待排序对象序列的初始排序无关,仅依赖于对象个数。在插入第i个对象时,需要经过[log2i]+1次关键码比较,才能确定它应插入的位置;
    • 当n较大时,总关键码比较次数比直接插入排序的最坏情况要好得多,但比其最好情况要差;
    • 在对象的初始排序已经按关键码排好序或接近有序时,直接插入排序比折半插入排序执行的关键码比较次数要少;
  • 折半插入排序的对象移动次数与直接插入排序相同,依赖于对象的初始排列
    • 减少了比价次数,但没有减少移动次数
    • 平均性能优于直接插入排序

8.2.3希尔排序

基本思想:先将整个待排记录序列分割成若干个系列,分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。

希尔排序算法,特点:

  1. 缩小增量
  2. 多遍插入排序

希尔排序(C语言实现)_healer-c的博客-CSDN博客_希尔排序c语言

超详细的排序算法讲解!一看就懂!_Coderoger的博客-CSDN博客_排序算法详解

希尔排序特点

  • 一次移动,移动位置较大,跳跃式地接近排序后的最终位置
  • 最后一次只需要少量移动
  • 增量序列必须是递减的,最后一个必须是1
  • 增量序列应该是互质的

希尔排序算法(主程序)

void ShellSort(Sqlist &L,int dlta[],int t){
  //按增量序列dlta[0..t-1]对顺序表L作希尔排序。
  for(k=0;k<t;++k)
    ShellInsert(L,dlta[k]);//一趟增量为dlta[k]的插入排序
}
void ShellInsert(SqList &L,int dk){
  //对顺序表L进行一趟增量为dk的Shell排序,dk为步长因子
  for(i=dk+1;i<=L.length;++i){
    if(r[i].key<r[i-dk].key){
      r[0]=r[i];
      for(j=i-dk;j>0&&(r[0].key<r[j].key);j=j-dk)
        r[j+dk]=r[j];
      r[j+dk]=r[0];
    }
  }
}

希尔排序算法分析

希尔排序是一种不稳定的排序方法

  • 如何选择最佳d序列,目前尚未解决
    • 最后一个增量值必须为1,无除了1之外的公因子
    • 不宜在链式存储结构上实现

8.3交换排序

基本思想:两两比较,如果发生逆序则交换,直到所有记录都排好序为止。

常见额交换排序方法:

​ 冒泡排序O(n2)

​ 快速排序O(nlog2n)

8.3.1冒泡排序

冒泡排序——基于简单交换思想

基本思想:每趟不断将记录两两比较,并按“前小后大”规则交换

带你读懂冒泡排序(Bubble Sorting)_Coder编程的博客-CSDN博客

总结:n个记录,总共需要n-1趟

第m趟需要比较 n-m次

void bubble_sort(SqList &L){
  int m,i,j;
  RedType x;//交换时临时存储
  for(m=1;m<=n-1;m++){//总共需m趟
  	for(j=1;j<=n-m;j++)
      if(L.r[j].key>L.r[j+i].key){//发生逆序
        x=L.r[j];
        L.r[j]=L.r[j+1];
        L.r[j+1]=x;//交换
      }
  }
}

优点:每趟结束时,不仅能挤出一个最大值到最后面位置,还能同时部分理顺其他元素;

如何提高效率?

​ 一旦某一趟比较时不出现记录交换,说明已排好序了,就可以结束本算法。

改进的冒泡排序算法

void bubble_sort(SqList &L){
  int m,i,j,flag=1;
  RedType x;//flag作为是否有交换的标记
  for(m=1;m<=n-1&&flag==1;m++){
    flag=0;
    for(j=1;j<=m;j++)
      if(L.r[j].key>L.r[j+1].key){//发生逆序
        flag=1;//发生交换,flag置为1,若本趟没发生交换,flag保持为0
        x=L.r[j];
        L.r[j]=L.r[j+1];
        L.r[j+1]=x;//交换
      }
  }
}

8.3.2快速排序

快速排序——改进的交换排序

基本思想

  • 任取一个元素(如:第一个)为中心
  • 所有比它小的元素一律前放,比它大的元素一律后放,形成左右两个子表;
  • 对各子表重新选择中心元素并依次规则调整
  • 直到每个子表的元素只剩一个

基本思想:通过一趟排序,将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可分别对这两部分记录进行排序,以达到整个序列有序。

具体实现:选定一个中间数作为参考,所有元素与之比较,小的调到其左边,大的调到其右边。

(枢轴)中间数:可以是第一个数、最后一个数、最中间一个数、任选一个数等。

数据结构值排序算法(三)-快速排序_tuke_tuke的博客-CSDN博客

  1. 每一趟的子表的形成是采用从两头向中间交替式逼近法;
  2. 由于每趟中对各子表的操作都相似,可采用递归算法
void main(){
  QSort(L,1,L.length);
}
void QSort(SqList &L,int low,int high){
  if(low<high){//长度大于1
    pivotloc=Partition(L,low,high);
    //将L.r[low..high]一分为二,pivotloc为枢轴元素排好序的位置
    QSort(L,low,pivotloc-1);//对低子表递归排序
    QSort(L,pivotloc+1,high);//对高子表递归排序
  }
}
int Partition(SqList &L,int low,int high){
  L.r[0]=L.r[low];
  pivotkey=L.r[low].key;
  while(low<high){
    while(low<high&&L.r[high].key>=pivotkey)
      --high;
    L.r[low]=L.r[high];
    while(low<high&&L.r[low].key<=pivotkey)
      ++low;
    L.r[high]=L.r[low];
  }
  L.r[low]=L.r[0];
  return low;
}

快速排序算法分析

  • 时间复杂度

    • 可以证明,平均计算时间是0(nlog2n)。
      • Qsort():O(log2n)
      • Partition():O(n)
    • 实验结果表明:就平均计算时间而言,快速排序是我们所讨论的所有排序方法中最好的一个
  • 空间排序

    快速排序不是原地排序

    ​ 由于程序中使用了递归,需要递归调用栈的支持,而栈的长度取决于递归调用的深度。(即使不用递归,也需要用用户栈)

    • 在平均情况下:需要O(logn)的栈空间
    • 最坏情况下:栈空间可达O(n)
  • 稳定性:快速排序是一种不稳定的排序方法

    ​ 由于每次枢轴记录的关键字都是大于其它所有记录的关键字,致使一次划分之后得到的子序列(1)的长度为0,这时已经退化成为没有改进措施的冒泡排序。

  • 快速排序不适于对原本有序或基本有序的记录序列进行排序。

  • 划分元素的选取是影响时间性能的关键

  • 输入数据次序越乱,所选划分元素值的随机性越好,排序适度越快,快速排序不是自然排序方法。

  • 改变划分元素的选取方法,至多只能改变算法平均情况下的世界性能,无法改变最坏情况下的时间性能。即最坏情况下,快速排序的时间复杂性总是O(n2)

  • 8.4选择排序

8.4.1简单选择排序

基本思想:在待排序的数据中选出最大(小)的元素放在其最终的位置。

基本操作

  1. 首先通过n-1次关键字比较,从n个记录中找出关键字最小的记录,将它与第一个记录交换
  2. 再通过n-2次比较,从剩余的n-1个记录中找出关键字次小的记录,将它与第二个记录交换
  3. 重复上述操作,共进行n-1趟排序后,排序结束

Go 数据结构和算法篇(六):选择排序 - 极客书房

void SelectSort(SqList &K){
  for(i=1;i<L.length;++i){
    k=i;
    for(j=i+1;j<=L.length;j++)
      if(L.r[j].key<L.r[k].key) k=j;//记录最小值位置
    if(k!=i)
      L.r[i]←→L.r[k];//交换
  }
}

时间复杂度

  • 记录移动次数
    • 最好情况:0
    • 最坏情况:3(n-1)
  • 比较次数:无论待排序处于什么状态,选择排序所需进行的“比较”次数都相同

算法稳定性

  • 简单选择排序是不稳定排序

8.4.2堆排序

堆排序c语言实现_阿常呓语的博客-CSDN博客_堆排序c语言

则分别称该序列{a1 a2 … an}为小根堆和大根堆。

​ 从堆的定义可以看出,堆实质是满足如下性质的完全二叉树:二叉树中任一非叶子结点均小于(大于)它的孩子结点。。

堆---实现最小堆及堆的插入与删除_Jammm的博客-CSDN博客_堆插入

堆排序:若在输出堆顶的最小值(最大值)后,使得剩余n-1个元素的序列重新又建成一个堆,则得到n个元素的次小值(次大值)……如此反复,便能得到一个有序序列,这个过程称之为堆排序。

实现堆排序需解决两个问题

  1. 如何由一个无序序列建成一个堆?
  2. 如何在输出堆顶元素后,调整剩余元素为一个新的堆?

小根堆

  1. 输出堆顶元素之后,以堆中最后一个元素替代之;
  2. 然后将根节点值与左、右子树的根结点值进行比较,并与其中小者进行交换;
  3. 重复上述操作,直至叶子结点,将得到新的堆,称这个从堆顶至叶子的调整过程为“筛选”

堆的调整

堆的向下调整算法、堆的向上调整算法、堆的基本功能实现_2021dragon的博客-CSDN博客_堆调整算法

筛选过程的算法描述为:

void HeapAdjust(elem R[],int s,int m){
  /*已知R[s..m]中记录的关键字除R[s]之外均满足堆的定义,本函数调整R[s]的关键字,使R[s..m
  ]成为一个大根堆*/
  rc=R[s];
  for(j=2*s;j<=m;j*=2){//沿key较大的孩子结点向下筛选
    if(j<m&&R[j]<R[j+1])//j为key较大的记录的下标
      ++j;
    if(rc>=R[j]) break;
    R[s]=R[j];//rc应该插入在位置s上
    s=j;
  }
  R[s]=rc;//插入
}

可以看出:

​ 对一个无序序列反复“筛选”就可以得到一个堆;即:从一个无序序列建堆的过程就是一个反复“筛选”的过程。

如何由无序序列建成一个堆?

​ 单结点的二叉树是堆;

​ 在完全二叉树中所有以叶子结点(序号i>n/2)为根的子树是堆。

​ 这样,我们只需依次将以序号为n/2,n/2-1,……,1的结点为根的子树均调整为堆即可。

​ 即:对应由n个元素组成的无序序列,“筛选”只需从第n/2个元素开始。

由于堆实质上是一个线性表,那么我们可以顺序存储一个堆。

筛选法建立初始小根堆图解_筛选法建立初始堆_肥肥鲨_的博客-CSDN博客

从最后一个非叶子结点开始,以此向前调整:

  1. 调整从第n/2个元素开始,将以该元素为根的二叉树调整为堆
  2. 将以序号为n/2-1的结点为根的二叉树调整为堆
  3. 再将以序号为n/2-2的结点为根的二叉树调整为堆;
  4. 再将以序号为n/2-3的结点为根的二叉树调整为堆

由以上分析知:

​ 若对一个无序序列建堆,然后输出根;重复该过程就可以由一个无序序列输出有序序列。

​ 实质上,堆排序就是利用完成二叉树中父结点与孩子结点之间的内在关系来排序的。

堆排序算法如下:

void HeapSort(elem R[]){//对R[1]到R[n]进行堆排序
  int i;
  for(i=n/2;i>=i;i--)
    HeapAdjust(R,i,n);//建初始堆
  for(i=n;i>1;i--){//进行n-1趟排序
    Swap(R[1],R[i]);//根与最后一个元素交换
    HeapAdjust(R,1,i-1);//对R[1]到R[i-1]重新建堆
  }
}
  • 堆排序的时间主要耗费在建初始堆和调整建新堆时进行的反复筛选上。堆排序在最坏情况下,其时间复杂度也为O(nlog2n),这是堆排序的最大优点。无论待排序中的记录是正序还是逆序排序,都不会使堆排序处于“最好”或“最坏”的状态。
  • 另外,堆排序仅需一个记录大小供交换用的辅助存储空间。
  • 然而堆排序是一种不稳定的排序方法,它不使用于待排序记录个数n较少的情况,但对于n较大的文件还是很有效的。

8.5归并排序

  • 基本思想:将两个或两个以上的有序子序列“归并”为一个有序序列。

  • 在内部排序中,通常采用的是2-路归并排序。

    • 即:将两个位置相邻的有序子序列R[l…m]和R[m+1…n]归并为一个有序序列R[l…n]

    Go 数据结构和算法篇(七):归并排序 - Geekr

【分治】合并排序、自然合并排序(C++)_shi_yq的博客-CSDN博客

关键问题:如何将两个有序序列合成一个有序序列?

8.6基数排序

基本思想分配+收集

也叫桶排序或箱排序:设置若干个箱子,将关键字为k的记录放入第k个箱子,然后在按序号将非空的连接。

基数排序:数字是有范围的,均由0-9这十个数字组成,则只需设置十个箱子,相继按个、十、百…进行排序。

(四)排序——基数排序_Sun Sun day的博客-CSDN博客

【排序】图解基数排序_str_818的博客-CSDN博客_基数排序图解

8.7各种排序方法比较

一、时间性能

  1. 按平均的时间性能来分,有三类排序方法:
    • 时间复杂度为O(nlogn)的方法有:、
      • 快速排序、堆排序和归并排序,其中以快速排序为最好;
    • 时间复杂度为O(n2)的有:
      • 直接插入排序、冒泡排序和简单选择排序,其中以直接插入为最好,特别是对那些对关键字近似有序的记录序列尤为如此;
    • 时间复杂度为O(n)的排序方法只有:基数排序。
  2. 当待排记录序列按关键字顺序有序时,直接插入排序和冒泡排序能达到O(n)的时间复杂度;而对于快速排序而言,这是最不好的情况,此时的时间性能退化为O(n2),因此是应该尽量避免的情况。
  3. 简单选择排序、堆排序和归并排序的时间性能不随记录序列中关键字的分布而改变。

二、空间性能

​ 指的是排序过程中所需的辅助空间大小

  1. 所有的简单排序方法(包括:直接插入、冒泡和简单选择)和堆排序的空间复杂度为O(1)
  2. 快速排序为O(logn),为栈所需的辅助空间
  3. 归并排序所需辅助空间最多,其空间复杂度为O(n)
  4. 链式基数排序需附设队列首尾指针,则空间复杂度为O(rd)

三、排序方法的稳定性能

  • 稳定的排序方法指的是,对于两个关键字相等的记录,它们在序列中的相对位置,在排序之前和经过排序之后,没有改变。
  • 当对多关键字的记录序列进行LSD方法排序时,必须采用稳定的排序方法。
  • 对于不稳定的排序方法,只要能举出一个实例说明即可。
  • 快速排序和堆排序是不稳定的排序方法。

四、关于“排序方法的时间复杂度的下限”

  • 本章讨论的各种排序方法,除基数排序外,其它方法都是基于“比较关键字”进行排序的排序方法,可以证明,这类排序法可能达到的最快的时间复杂度为O(nlogn)。

    (基数排序不是基于“比较关键字”的排序方法,所以它不受这个限制)

  • 可以用一棵判定树来描述这类基于“比较关键字”进行排序的排序方法。

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

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

相关文章

Arduino 入门学习笔记10 使用I2C的OLED屏幕

Arduino 入门学习笔记10 使用I2C的OLED屏幕 一、准备工具二、JMD0.96C-1介绍1. 显示屏参数2. SSD1306驱动芯片介绍&#xff1a; 三、使用Arduino开发步骤1. 安装库&#xff08;1&#xff09;Adafruit_GFX_Library 库&#xff08;2&#xff09;Adafruit_SSD1306 驱动库&#xff…

HCIP——STP配置案例

STP配置案例 一、简介二、实现说明1、华为实现说明2、其他厂商实现 三、STP原理1、协商原则2、角色和状态3、报文格式4、BPDU报文处理流程4.1 BPDU报文的分类4.2 BPDU报文的处理流程4.3 BPDU报文格式 四、使用注意事项五、配置举例1、组网需求2、配置思路3、操作步骤4、配置文件…

多维时序 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络的数据多变量时间序列预测

多维时序 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络的数据多变量时间序列预测 目录 多维时序 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经网络的数据多变量时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 多维时序 | MATLAB实现WOA-CNN鲸鱼算法优化卷积神经…

大模型技术实践(一)|ChatGLM2-6B基于UCloud UK8S的创新应用

近半年来&#xff0c;通过对多款主流大语言模型进行了调研&#xff0c;我们针对其训练方法和模型特点进行逐一分析&#xff0c;方便大家更加深入了解和使用大模型。本文将重点分享ChatGLM2-6B基于UCloud云平台的UK8S实践应用。 01各模型结构及特点 自从2017年6月谷歌推出Transf…

【OpenCV学习笔记】我的OpenCV学习之路

刚开始接触OpenCV是因为需要进行图像的处理&#xff0c;由于之前没有接触过&#xff0c;所以只能自己进行学习&#xff0c;下面将学习的过程做简单记录分享。 OpenCV专栏链接 OpenCV学习笔记 一、引言 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是…

【C# 基础精讲】文件读取和写入

文件读取和写入是计算机程序中常见的操作&#xff0c;用于从文件中读取数据或将数据写入文件。在C#中&#xff0c;使用System.IO命名空间中的类来进行文件读写操作。本文将详细介绍如何在C#中进行文件读取和写入&#xff0c;包括读取文本文件、写入文本文件、读取二进制文件和写…

MyBatis动态SQL:打造灵活可变的数据库操作

目录 if标签trim标签where标签set标签foreach标签 动态SQL就是根据不同的条件或需求动态地生成查询语句&#xff0c;比如动态搜索条件、动态表或列名、动态排序等。 if标签 在我们填写一些信息时&#xff0c;有些信息是必填字段&#xff0c;有的则是非必填的&#xff0c;这些…

Docker版TDengine2.6升级到Tdengine3.0

此升级性质为导入导出操作 2.6版本操作步棸 进入docker容器 docker exec -it a5f88c26119d bash 查找taosdump文件路径 find -name /taosdump 进入taosdump外层文件夹中&#xff0c;执行导出命令 ./taosdump -o /root -D power -T 4 实际导出命令可根据个人需求查到官方文档…

Spring Boot中使用validator如何实现接口入参自动检验

文章目录 一、背景二、使用三、举例 一、背景 在项目开发过程中&#xff0c;经常会对一些字段进行校验&#xff0c;比如字段的非空校验、字段的长度校验等&#xff0c;如果在每个需要的地方写一堆if else 会让你的代码变的冗余笨重且相对不好维护&#xff0c;如何更加规范和优…

【经典排序】—— “希尔排序”

插入排序希尔排序插入排序VS希尔排序 测试 希尔排序是在插入排序的基础上进行改进优化&#xff0c;所以学习希尔排序之前需要先了解插入排序。 插入排序 像玩扑克牌摸牌时一样&#xff0c;一张一张摸&#xff0c;每摸到一张插入到对应的位置&#xff0c;插入排序就是从第一个位…

最强自动化测试框架Playwright(33)-Route类拦截修改请求

在Playwright中&#xff0c;Route类用于捕获和修改请求和响应。它允许您拦截和处理特定的网络请求&#xff0c;以模拟不同的行为或进行自定义操作。 您可以使用page.route()方法创建Route对象&#xff0c;并指定要拦截的请求URL或使用正则表达式进行匹配。 一旦创建了Route对…

hive--给表名和字段加注释

1.建表添加注释 CREATE EXTERNAL TABLE test(loc_province string comment 省份,loc_city string comment 城市,loc_district string comment 区,loc_street string comment 街道,)COMMENT 每日数据处理后的表 PARTITIONED BY (par_dt string) ROW FORMAT SERDEorg.apache.had…

SpringBoot ⽇志⽂件

日志 1. 作用2. 日志的使用3. 日志的级别4. 日志的持久化 1. 作用 日志最主要的⽤途就是排除和定位问题。 除了发现和定位问题之外&#xff0c;我们还可以通过⽇志实现以下功能&#xff1a; 记录⽤户登录⽇志&#xff0c;⽅便分析⽤户是正常登录还是恶意破解⽤户。记录系统的…

【Elasticsearch】spring-boot-starter-data-elasticsearch的使用以及Elasticsearch集群的连接

更多有关博主写的往期Elasticsearch文章 标题地址【ElasticSearch 集群】Linux安装ElasticSearch集群&#xff08;图文解说详细版&#xff09;https://masiyi.blog.csdn.net/article/details/131109454基于SpringBootElasticSearch 的Java底层框架的实现https://masiyi.blog.c…

如何在 Elasticsearch 中将矢量搜索与过滤结合起来 - Python 8.x

大型语言模型&#xff08;LLM&#xff09;每天都在发展&#xff0c;这种情况有助于语义搜索的扩展。 LLM 擅长分析文本和揭示语义相似性。 这种情况也反映在搜索引擎上&#xff0c;因为语义搜索引擎可以为用户提供更满意的结果。 尽管大型语言模型可以捕获语义上接近的结果&am…

zabbix整合prometheus的数据

1 zabbix安装 官方文档参考 https://www.zabbix.com/download?zabbix6.0&os_distributioncentos&os_version7&componentsproxy&dbmysql&ws https://www.zabbix.com/download?zabbix4.0&os_distributioncentos&os_version7&componentsserver…

【抖音直播小玩法】介绍

一、是什么 直播小玩法是基于抖音直播场景的新型实时互动内容。直播小玩法由开发者自主开发&#xff0c;接入平台并开放给抖音主播挂载使用。开发者提供创意&#xff0c;依托平台生态&#xff0c;获取收益。 介入标准&#xff1a; 企业开发者&#xff0c;暂不支持个人开发者…

8.文件存储空间管理

第四章 文件管理 8.文件存储空间管理 空闲表法&#xff1a;   空闲盘块表和在内存管理的动态分区分配中学习过的空闲分区表是类似的&#xff0c;空闲盘块表记录了每一个空闲区间的起始位置和这个空闲区间的长度这两个信息。像第一个空闲区间是0&#xff0c;1这两个空闲块&am…

【克罗恩病是银屑病及银屑病关节炎的因果风险因素】

克罗恩病是银屑病及银屑病关节炎的因果风险因素 ①纳入463372名欧洲人&#xff0c;包括12882例IBD患者、5621例银屑病患者、2063例银屑病关节炎患者&#xff1b;②单变量孟德尔随机化&#xff08;MR&#xff09;分析表明&#xff0c;基于遗传因素预测的IBD与较高的银屑病和银屑…

复数混频器、零中频架构和高级算法开发

文章里讲解了关于射频IQ调制器、零中频架构相关的原理及技术&#xff0c;全都是干货&#xff01;其实好多同行对软件无线电的原理、IQ调制、镜像抑制都是一知半解&#xff0c;知其然不知其所以然。好好研读这篇文章&#xff0c;相信会让你有种恍然大悟的感觉。 RF工程常被视为…