排序算法。
快速排序:QuickSort
选标准值,将比标准值小的放在其左侧,将比标准值大的放在其右侧,左右两部分分别重复以上操作
1.挖坑填补法


拆东墙补西墙
先把第一个数拿出来用temp储存 然后从最后面遍历 找到比temp小的放到第一个位置 然后再从前面第二个开始遍历找比temp大的放在后面的空位上 重复操作 直到end和begin在一块 然后再在temp两边分别重复操作

#include<stdio.h>int Find(int arr[],int nBegin,int nEnd)
{int temp = arr[nBegin];while(nBegin < nEnd){//从后向前找比标准值小的while(nEnd > nBegin){if(arr[nEnd] < temp){arr[nBegin] = arr[nEnd];nBegin++;break;}nEnd--; }//从前往后找比标准值大的while(nBegin < nEnd){if(arr[nBegin] > temp){arr[nEnd] = arr[nBegin];nEnd--;break;}nBegin++;} }//标准值放入arr[nBegin] = temp;return nBegin;
}void QuickSort(int arr[],int nBegin,int nEnd)
{if(arr == NULL || nBegin >= nEnd)return;//确定标准值最终位置int nStandard;nStandard = Find(arr,nBegin,nEnd);//将数据分成两部分 分别重复以上操作QuickSort(arr,nBegin,nStandard-1);QuickSort(arr,nStandard+1,nEnd);
}void Print(int arr[],int length)
{if(arr == NULL || length <=0)return;int i;for(int i=0;i<length;i++){printf("%d ",arr[i]);}printf("\n");
}int main()
{int arr[] = {2,4,7,1,5,14,89,13,2};QuickSort(arr,0,sizeof(arr)/sizeof(arr[0])-1);Print(arr,sizeof(arr)/sizeof(arr[0]));return 0;
}
2.区间分割法

small指向begin-1 begin从前向后遍历 遇见比end小的 就交换small+1与begin 最终将小于10的全放在一边
若 a = i++; 则等价于 a=i;i=i+1; 而 a = ++i; 则等价于 i=i+1;a=i;
#include<stdio.h>int Find(int arr[],int nBegin,int nEnd)
{int nSmall = nBegin-1;for(nBegin;nBegin < nEnd;nBegin++){if(arr[nBegin] < arr[nEnd]){if(++nSmall != nBegin){arr[nSmall] = arr[nSmall]^arr[nBegin];arr[nBegin] = arr[nSmall]^arr[nBegin];arr[nSmall] = arr[nSmall]^arr[nBegin];}}}//将标准值放入if(++nSmall != nEnd){arr[nSmall] = arr[nSmall]^arr[nEnd];arr[nEnd] = arr[nSmall]^arr[nEnd];arr[nSmall] = arr[nSmall]^arr[nEnd];}return nSmall;
}void QuickSort(int arr[],int nBegin,int nEnd)
{if(arr == NULL || nBegin >= nEnd)return;//确定标准值最终位置int nStandard;nStandard = Find(arr,nBegin,nEnd);//将数据分成两部分 分别重复以上操作QuickSort(arr,nBegin,nStandard-1);QuickSort(arr,nStandard+1,nEnd);
}void Print(int arr[],int length)
{if(arr == NULL || length <=0)return;int i;for(int i=0;i<length;i++){printf("%d ",arr[i]);}printf("\n");
}int main()
{int arr[] = {2,4,7,1,5,14,89,13,2};QuickSort(arr,0,sizeof(arr)/sizeof(arr[0])-1);Print(arr,sizeof(arr)/sizeof(arr[0]));return 0;
}
MergeSort: 归并排序
将多个有序数组进行合并


#include<stdio.h>
#include<stdlib.h>void Merge(int arr[],int nBegin,int nEnd)
{int nBegin1 = nBegin;int nEnd1 = nBegin+(nEnd-nBegin)/2;int nBegin2 = nEnd1+1;int nEnd2 = nEnd;int *pTemp =NULL;pTemp = (int*)malloc(sizeof(int)*(nEnd-nBegin+1));int i=0;//遍历两个数组while(nBegin1 <= nEnd1 && nBegin2 <= nEnd2){if(arr[nBegin2] < arr[nBegin1]){pTemp[i++] = arr[nBegin2++];}else{pTemp[i++] = arr[nBegin1++];}}//将有剩余的数组元素放置while(nBegin1 <= nEnd1){pTemp[i++] = arr[nBegin1++];}while(nBegin2 <= nEnd2){pTemp[i++] = arr[nBegin2++];}//放回for(int i=0;i<nEnd-nBegin+1;i++){arr[nBegin+i] = pTemp[i];} free(pTemp);pTemp = NULL;
} void MergeSort(int arr[],int nBegin,int nEnd)
{if(arr == NULL || nBegin >= nEnd)return;//分割 int nMid = nBegin + (nEnd-nBegin)/2;MergeSort(arr,nBegin,nMid);MergeSort(arr,nMid+1,nEnd);//合并Merge(arr,nBegin,nEnd);
} void Print(int arr[],int length)
{if(arr == NULL || length <=0)return;int i;for(int i=0;i<length;i++){printf("%d ",arr[i]);}printf("\n");
}int main()
{int arr[] = {2,4,7,1,5,14,89,13,2};MergeSort(arr,0,sizeof(arr)/sizeof(arr[0])-1);Print(arr,sizeof(arr)/sizeof(arr[0]));return 0;
}
冒泡排序:BubbleSort
相邻两个元素进行大小比较,如果前一个比后一个大,则二者发生交换

第一横:8和6比 8比6大 交换 8和3比 8比3大 交换 8和12比 没12大 不动 12和1比 比12大交换 12和7比 比12大交换 12没15大 不动
第二横;6和3比。。。。。。。
#include<stdio.h>void BubbleSort(int arr[],int length)
{if(arr == NULL || length<=0)return;int i;int j;for(int i=0;i<length-1;i++) //总排n-1回 {for(int j=0;j<length-i-1;j++) //每次固定一个大的,然后俩俩比较再-1 {if(arr[j] > arr[j+1]){arr[j] = arr[j]^arr[j+1];arr[j+1] = arr[j]^arr[j+1];arr[j] = arr[j]^arr[j+1];}}}
}void Print(int arr[],int length)
{if(arr == NULL || length <=0)return;int i;for(int i=0;i<length;i++){printf("%d ",arr[i]);}printf("\n");
}int main()
{int arr[] = {2,4,7,1,5,14,89,13,2};BubbleSort(arr,sizeof(arr)/sizeof(arr[0]));Print(arr,sizeof(arr)/sizeof(arr[0]));return 0;
}
堆排序:HeapSort




先创建一个初始堆,从下到上调节父亲节点,使得每个父亲节点的值比两个孩子大,最大值就窜到最上面了,接着交换第一和最后,拿掉最后面的最大值,重复调整堆顶,拿出每个最大值
调整操作 先把两个孩子比一下取最大值跟爹比 要比爹大就交换 然后交换下来的爹也得看看他的儿子比不比他大
#include<stdio.h>#define LEFT (2*nRootID+1)
#define RIGHT (2*nRootID+2)void Adjust(int arr[],int length,int nRootID)
{int MAX;for(MAX = LEFT;MAX < length;MAX = LEFT){//两个孩子if(RIGHT < length){if(arr[MAX] < arr[RIGHT]){MAX = RIGHT;}}//比较大小if(arr[nRootID] < arr[MAX]){//交换arr[nRootID] = arr[nRootID]^arr[MAX];arr[MAX] = arr[nRootID]^arr[MAX];arr[nRootID] = arr[nRootID]^arr[MAX];nRootID = MAX;}else{break;} }
}void HeapSort(int arr[],int length)
{if(arr == NULL || length <=0)return;//建初始堆int i;for(i = length/2-1;i>=0;i--){Adjust(arr,length,i);}//排序for(i = length-1;i>0;i--){//交换arr[0] = arr[i]^arr[0];arr[i] = arr[i]^arr[0];arr[0] = arr[i]^arr[0];//调整堆顶Adjust(arr,i,0);}
}void Print(int arr[],int length)
{if(arr == NULL || length <=0)return;int i;for(int i=0;i<length;i++){printf("%d ",arr[i]);}printf("\n");
}int main()
{int arr[] = {2,4,7,1,5,14,89,13,2};HeapSort(arr,sizeof(arr)/sizeof(arr[0]));Print(arr,sizeof(arr)/sizeof(arr[0]));return 0;
}
桶排序:BucketSort
数据分组,各组之内进行排序

#include<stdio.h>
#include<stdlib.h>
#include<string.h>typedef struct node
{int value;struct node *pNext;
}Bucket;void Sort(Bucket *pHead)
{if(pHead == NULL || pHead->pNext == NULL)return;Bucket *pi = NULL;Bucket *pj = NULL;pi = pHead;while(pi->pNext != NULL) // n-1趟 {pj = pHead; // 每次遍历从表头开始 while(pj->pNext != NULL) // j和j的下一个进行比较 保证下一个有东西 {if(pj->value > pj->pNext->value){pj->value = pj->value^ pj->pNext->value;pj->pNext->value = pj->value^ pj->pNext->value;pj->value = pj->value^ pj->pNext->value;}pj = pj->pNext; // j++ }pi = pi->pNext; // i++ 减少趟数 }
}void BucketSort(int arr[],int length)
{if(arr == NULL || length <=0)return;//1.最大值 最小值int nMin = arr[0];int nMax = arr[0];int i;for(int i=1;i<length;i++){if(arr[i] < nMin){nMin = arr[i];}if(arr[i] > nMax){nMax = arr[i];}}//2.位数int nCount = 1;int nNum = nMax;while(nNum){nNum/=10;nCount*=10;}nCount/=10; //863变100 23变10 //3.表头int nMinIndex = nMin/nCount;int nMaxIndex = nMax/nCount;Bucket **pBucket = NULL;pBucket = (Bucket**)malloc(sizeof(Bucket*)*(nMaxIndex-nMinIndex+1));memset(pBucket,0,sizeof(Bucket*)*(nMaxIndex-nMinIndex+1));//4.元素入桶Bucket *pTemp = NULL;for(int i=0;i<length;i++){nNum = arr[i]/nCount-nMinIndex;pTemp = (Bucket*)malloc(sizeof(Bucket));pTemp->value = arr[i];pTemp->pNext = pBucket[nNum];pBucket[nNum] = pTemp; }//5.各桶之间元素排序for(int i=0;i<nMaxIndex-nMinIndex+1;i++){Sort(pBucket[i]);}//6.放回nNum=0;for(int i=0;i<nMaxIndex-nMinIndex+1;i++){pTemp = pBucket[i];while(pTemp){arr[nNum] = pTemp->value;nNum++;pTemp = pTemp->pNext;} }//7.释放Bucket *pDel = NULL;for(int i=0;i<nMaxIndex-nMinIndex+1;i++){pTemp = pBucket[i];while(pTemp){pDel = pTemp;pTemp = pTemp->pNext;free(pDel);pDel = NULL;}}free(pBucket);pBucket = NULL;
}void Print(int arr[],int length)
{if(arr == NULL || length <=0)return;int i;for(int i=0;i<length;i++){printf("%d ",arr[i]);}printf("\n");
}int main()
{int arr[] = {201,405,743,165,589,140,989,193,288};BucketSort(arr,sizeof(arr)/sizeof(arr[0]));Print(arr,sizeof(arr)/sizeof(arr[0]));return 0;
}
选择排序:SelectSort
找最大值放到最后/最小值放在最前面

6和3比3大 6和9比没九大 max=9的下标 9和1比 然后一顿比 最大放在最后
#include<stdio.h>void SelectSort(int arr[],int length)
{if(arr == NULL || length<=0)return;int i;int j;int min;for(int i=0;i<length-1;i++){min=i;for(int j=i+1;j<length;j++){if(arr[j]<arr[min]){min=j;}}//最小值放入最前面if(min!= i){arr[i]=arr[i]^arr[min];arr[min]=arr[i]^arr[min];arr[i]=arr[i]^arr[min];} }
}void Print(int arr[],int length)
{if(arr == NULL || length <=0)return;int i;for(int i=0;i<length;i++){printf("%d ",arr[i]);}printf("\n");
}int main()
{int arr[] = {2,4,7,1,5,14,89,13,2};SelectSort(arr,sizeof(arr)/sizeof(arr[0]));Print(arr,sizeof(arr)/sizeof(arr[0]));return 0;
}
插入排序:InsertSort
将待排序数据分成两部分,一部分有序,一部分无序,将无序元素依次插入到有序中去完成排序

#include<stdio.h>void InsertSort(int arr[],int length)
{if(arr == NULL || length <=0)return;int i; //无序的第一个int j; //有序的最后一个int temp;for(int i=1;i<length;i++){j=i-1;temp=arr[i]; //无序的第一个元素while(j>=0 && temp<arr[j]){arr[j+1] = arr[j];j--;}arr[j+1]=temp; }
}void Print(int arr[],int length)
{if(arr == NULL || length <=0)return;int i;for(int i=0;i<length;i++){printf("%d ",arr[i]);}printf("\n");
}int main()
{int arr[] = {2,4,7,1,5,14,89,13,2};InsertSort(arr,sizeof(arr)/sizeof(arr[0]));Print(arr,sizeof(arr)/sizeof(arr[0]));return 0;
}
希尔排序:ShellSort
将数据分组,各组之内插入排序,比原有插入排序更快,适合大量数据,不常用。

计数排序:CountingSort
核心思想:基于非比较的排序
1.找最大值和最小值
2.计数
3.排序

#include<stdio.h>
#include<stdlib.h>
#include<string.h> //memsetvoid CountingSort(int arr[],int length)
{if(arr == NULL || length <=0)return;int i;int min = arr[0];int max = arr[0];//最大值最小值查找for(int i=1;i<length;i++){if(arr[i]<min){min=arr[i];}if(arr[i]>max){max=arr[i];} }//计数空间int *pCount=NULL;pCount=(int*)malloc(sizeof(int)*(max-min+1));memset(pCount,0,sizeof(int)*(max-min+1));//计数for(i=0;i<length;i++){pCount[arr[i]-min]++;}//名次for(int i=1;i<max-min+1;i++){pCount[i]=pCount[i]+pCount[i-1];}//排序int *pNew = (int*)malloc(sizeof(int)*length);for(i=length-1;i>=0;i--){pNew[pCount[arr[i]-min]-1]=arr[i];pCount[arr[i]-min]--;}//放回原数组for(int i=0;i<length;i++){arr[i]=pNew[i];}free(pNew);pNew=NULL;free(pCount);pCount=NULL;
}
void Print(int arr[],int length)
{if(arr == NULL || length <=0)return;int i;for(int i=0;i<length;i++){printf("%d ",arr[i]);}printf("\n");
}int main()
{int arr[] = {2,4,7,1,5,14,89,13,2};CountingSort(arr,sizeof(arr)/sizeof(arr[0]));Print(arr,sizeof(arr)/sizeof(arr[0]));return 0;
}
基数排序:RadixSort
LSD:低位优先
MSD:高位优先

#include<stdio.h>
#include<stdlib.h>
#include<string.h>typedef struct node
{int value;struct node *pNext;
}Radix;void RadixSort(int arr[],int length)
{if(arr == NULL || length <= 0)return;//找最大值int nMax = arr[0];int i;for(int i=1;i<length;i++) {if(arr[i] > nMax){nMax = arr[i];}}//计算最大值位数int nCount = 0;while(nMax){nMax/=10;nCount++;}//按位处理int nLoopTimes;int nbase = 1;//表头 Radix **pRadix = NULL;pRadix = (Radix**)malloc(sizeof(Radix*)*10);memset(pRadix,0,sizeof(Radix*)*10);for(nLoopTimes = 1;nLoopTimes<=nCount;nLoopTimes++){i = nLoopTimes;while(i>1){nbase*=10;i--;}//数据入组Radix *pTemp = NULL;for(i = 0;i<length;i++){pTemp = (Radix*)malloc(sizeof(Radix));pTemp->value = arr[i];pTemp->pNext = NULL;//尾添加if(pRadix[arr[i]/nbase%10] == NULL){pRadix[arr[i]/nbase%10] = pTemp;}else{Radix *pNode = pRadix[arr[i]/nbase%10];while(pNode->pNext){pNode = pNode->pNext;}pNode->pNext = pTemp;}}//放回 int j=0;for(i=0;i<10;i++){pTemp = pRadix[i];while(pTemp){arr[j]=pTemp->value;pTemp = pTemp->pNext;j++;}} //释放Radix *pDel = NULL;for(int i=0;i<10;i++){pTemp = pRadix[i];while(pTemp){pDel = pTemp;pTemp = pTemp->pNext;free(pDel);pDel = NULL;}}//清空memset(pRadix,0,sizeof(Radix*)*10); } free(pRadix);pRadix = NULL;
}void Print(int arr[],int length)
{if(arr == NULL || length <=0)return;int i;for(int i=0;i<length;i++){printf("%d ",arr[i]);}printf("\n");
}int main()
{int arr[] = {53, 3, 542, 748, 14, 214, 154, 63, 616};RadixSort(arr,sizeof(arr)/sizeof(arr[0]));Print(arr,sizeof(arr)/sizeof(arr[0]));return 0;
}
相关文章:
排序算法。
快速排序:QuickSort 选标准值,将比标准值小的放在其左侧,将比标准值大的放在其右侧,左右两部分分别重复以上操作 1.挖坑填补法 拆东墙补西墙 先把第一个数拿出来用temp储存 然后从最后面遍历 找到比temp小的放到第一个位置 然后…...
告别 “屎山” 代码,务必掌握这14 个 SpringBoot 优化小妙招
插: AI时代,程序员或多或少要了解些人工智能,前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家(前言 – 人工智能教程 ) 坚持不懈,越努力越幸运,大家…...
测量无人船作业流程是怎样的?
在一些特殊水域测量作业中,使用有人船进行测量时受阻较多,而采用无人测量船则效率就非常高了,它是解决复杂水域测量问题最直接最有效的方式。那么,测量无人船作业流程是怎样的?下面就让小编来为大家简单介绍一下&#…...
四川赤橙宏海商务信息咨询有限公司抖音开店靠谱吗?
在数字化浪潮席卷全球的今天,电商行业正以前所未有的速度发展。而在这个大潮中,四川赤橙宏海商务信息咨询有限公司凭借其专业的团队和前瞻性的战略眼光,专注于抖音电商服务,为广大商家提供了一站式解决方案,成为了行业…...
解决ssh: connect to host IP port 22: Connection timed out报错(scp传文件指定端口)
错误消息 ssh: connect to host IP port 22: Connection timed out 指出 SSH 客户端尝试连接到指定的 IP 地址和端口号(默认 SSH 端口是 22),但是连接超时了。这意味着客户端没有在预定时间内收到来自服务器的响应。 可能的原因 SSH 服务未…...
【笔记】echarts图表的缩放和鼠标滚动冲突的处理解决方案
解决方案不是很好,来源于github的issue,官方提供了,组合键触发缩放的功能。 https://github.com/apache/echarts/issues/5769 https://echarts.apache.org/zh/option.html#dataZoom-inside.zoomOnMouseWheel dataZoom-inside.zoomOnMouseWhe…...
代码随想录训练营Day51
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、不同的子序列二、两个字符串的删除操作三、编辑距离 前言 提示:这里可以添加本文要记录的大概内容: 今天是跟着代码随想录刷题的第…...
C#上位机与PLC
在工业自动化的舞台上,C#上位机与PLC之间的通信是一曲精妙绝伦的交响乐。今天,我们将一起揭开C#上位机与PLC通信的三种神秘实现方法,探索它们如何共同谱写出高效、稳定、灵活的工业自动化乐章。 序幕:通信的“前奏” 在深入了解…...
CVE-2018-8120漏洞提权:Windows 7的安全剖析与实战应用
CVE-2018-8120漏洞提权:Windows 7的安全剖析与实战应用 在网络安全的世界里,漏洞利用常常是攻击者用来获取系统控制权的捷径。2018年发现的CVE-2018-8120漏洞,针对Windows 7操作系统,提供了一个这样的途径。本文将深入分析这一漏…...
Python-正则表达式
目录 一、打开正则表达式 二、正则表达式的使用 1、限定符 (1)x*:*表示它前面的字符y 可以有0个或多个; (2)x:表示它前面的字符可以出现一次以上;(只可以匹配多次&…...
教程:在 Kubernetes 集群上部署 WordPress 网站
WordPress 是专为每个人设计的开源软件,强调创建网站、博客或应用程序的可访问性、性能、安全性和易用性。WordPress 是一个基于 PHP 的内容管理系统(CMS),使用 MySQL 作为数据存储,目前很多网站、电商独立站、个人博客…...
聊一聊 C# 弱引用 底层是怎么玩的
一:背景 1. 讲故事 最近在分析dump时,发现有程序的卡死和WeakReference有关,在以前只知道怎么用,但不清楚底层逻辑走向是什么样的,借着这个dump的契机来简单研究下。 二:弱引用的玩法 1. 一些基础概念 …...
蜘蛛池规矩采集优化与运用技巧 什么是蜘蛛池/SEO蜘蛛池怎么养?(蜘蛛池新手入门虚良SEO)
作为一名网络内容修改,我常常需求从各种网站上收集文章并转载到咱们的网站上。而在这个过程中,我深深感受到了蜘蛛池对我的帮助。今日,我就来共享一下我对蜘蛛池收集规矩的亲自感受。 归纳 本文将分9个方面具体介绍蜘蛛池收集规矩的长处和运…...
SerDes介绍以及原语使用介绍(1)OSERDESE2
文章目录 前言:为什么需要serdes一、OSERDESE2框图二、OSERDESE2端口信号二、OSERDESE2原语参数三、OSERDESE2时序3.1、SDR模式3.2、DDR模式3.3、DDR模式下三态传输 前言:为什么需要serdes 需要 SerDes(串行器/解串器)主要是为了…...
基于单片机和组态王的温度监控系统的设计
摘 要 : 介绍了以 MSP430 单片机为核心 , 建立基于 DS18B20 和组态王的温度采集和监控系统。主要研究了单片机和组态王的通用通讯协议。按照 KingView 提供的通信协议 , 设计组态王与单片机的通信程序 , 实现了组态王与M SP430 单片机的直接串行通讯。在中药提取装置的…...
unity 导入的模型设置讲解
咱们先讲Model这一栏 Model Scene:场景级属性,例如是否导入灯光和照相机,以及使用什么比例因子。 Scale Factor:缩放因子(也就是模型导入后大小如果小了或者大了在这里直接改是相当于该模型的大小的,而且在…...
汽车 vSOC安全运营管理平台开发解决方案
汽车 vSOC 安全解决方案 一、引言 随着汽车行业的快速发展,汽车的智能化和互联化程度越来越高,汽车网络安全问题也日益凸显。汽车 vSOC(Vehicle Security Operations Center)作为汽车网络安全的重要组成部分,其作用越来越受到重视。本方案旨在提供一套可实施落地的汽车 vS…...
python 第三方库
一、什么是第三方库 python的三方库指的是,需要通过pip install 安装后才能使用的 python 工具 三方库有很多: 做web自动化测试的库:selenium单元测试框架:pytest、unittest做app自动化测试:Python-Appium-Client做接…...
VMware Workstation环境下,DHCP服务的安装配置,用ubuntu来测试
需求说明: 某企业信息中心计划使用IP地址17216.11.0用于虚拟网络测试,注册域名为xyz.net.cn.并将172.16.11.2作为主域名的服务器(DNS服务器)的IP地址,将172.16.11.3分配给虚拟网络测试的DHCP服务器,将172.16.11.4分配给虚拟网络测试的web服务器,将172.16.11.5分配给FTP服务器…...
CSS实现文字颜色渐变
直接上代码和效果图: <p class"linecolor">文字颜色渐变</p><style type"text/css">.linecolor{font-size: 30px;background-image:-webkit-linear-gradient(bottom,red,#fd8403,yellow);-webkit-background-clip:text;-web…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止
<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet: https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...
抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...
Cinnamon修改面板小工具图标
Cinnamon开始菜单-CSDN博客 设置模块都是做好的,比GNOME简单得多! 在 applet.js 里增加 const Settings imports.ui.settings;this.settings new Settings.AppletSettings(this, HTYMenusonichy, instance_id); this.settings.bind(menu-icon, menu…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
ElasticSearch搜索引擎之倒排索引及其底层算法
文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...
