算法记录 : 基本排序

漫谈经典排序算法:二、各种插入排序解析及性能比较 1、序言 这是《漫谈经典排序算法系列》第二篇,解析了各种插入排序算法。主要包括:直接插入排序、折半插入排序、表插入排序、希尔插入排序。每一种算法的开头都叙述了引出该算法的原因,然后给出代码,最后分析算法效率及和其他插入排序相比,优劣在哪里。 各种排序算法的解析请参考如下: 阅读详情
好几天没动编译器了,今天先练练手,下次给出Shell排序,堆排序和归并排序

    这几天心情还可以,不过有点不务正业,先给出一套基本的排序算法,下次给出一组复杂的排序算法,最后让他们来个火并
inline void exch(t_uint32 &a, t_uint32 &b) 
{ 
  t_uint32 tmp 
= a; 
  a 
= b; 
  b 
= tmp; 
}
 
inline 
bool comp_exch(t_uint32 &a, t_uint32 &b) 
{ 
  
if(b < a) 
  
{ 
    exch(a,b); 
    
return true; 
  }
else 
  
{ 
    
return false; 
  }
 
}
 


inline 
void bleb_sort(t_uint32 *arr, size_t n) 
{ 
  size_t left 
= 0, right = n - 1; 
  
for(size_t i = left; i < right; ++i) 
  
{ 
    
for(size_t j = right; j > left; --j) 
    
{ 
      comp_exch(arr[j 
- 1], arr[j]); 
    }
 
  }
 
}
 

    这个是选择排序,选择排序的运作是找出最小的一个,和最左面的交换,而后把剩下的数组当作一个新的来对待
    这个select的缺点是不依赖于数组内已经形成的顺序,所以比较操作不会少,但是优势是移动操作很少,因此在某些机器上也许会快一些

void select_sort(t_uint32 *arr, size_t n) 
{ 
  
for(size_t i = 0; i < n - 1; ++i) 
  
{ 
    size_t min 
= i; 
     
    
for(size_t j = i + 1; j < n; ++j) 
    
{ 
      
if(arr[j] < arr[min]) 
      
{ 
        min 
= j; 
      }
 
    }
 
    exch(arr[i], arr[min]); 
     
  }
 
}
 

void insertion_sort(t_uint32 *arr, size_t n) 
{ 
  
for(size_t i = 1; i < n; ++i) 
  
{ 
    
for(size_t j = i; j > 0; --j) 
    
{ 
      
if(!comp_exch(arr[j - 1], arr[j])) break; 
    }
 
  }
 
}
 

void insertion_sort2(t_uint32 *arr, size_t n) 
{ 
  
for(size_t j = n - 1; j > 0; --j) comp_exch(arr[j - 1], arr[j]);//先找出最小的元素,放到arr[0]做终结标记 
  for(size_t i = 2; i < n; ++i) 
  
{ 
    size_t j 
= i; 
    t_uint32 tmp 
= arr[j];//先存一份copy 
     
    
while(tmp < arr[j - 1])  //如果它小于前面那个有序序列中的最大一个 
    { 
      arr[j] 
= arr[j - 1];  //那么前面那个有序序列中每个大于tmp的都要向后挪一个元素(因为最初的tmp被保存了,所以无所谓被覆盖) 
      j--; 
    }
 
    arr[j] 
= tmp; 
  }
 
}

 
    这是insertion的一个优化版本 
    这个是插入排序,可以认为先从最左面的元素开始,形成一个有序的序列,例如a[0]是有序的,而后第一次循环就j = i此时,i = 1, j 也等于1,所以第一次循环之后形成一个arr[0],arr[1]是有序的,而后 i = 2, j等于2,这里等于把arr[2]当作一个元素插入
前面有序的序列arr[0], arr[1],此时这个序列所有比arr[2]大的元素都要向后移动一次,如果前面的比arr[2]小,则终止内圈循环

    冒泡实在没啥可说的,就是把最小的值移动到数组最最左边,然后把left加一当作一个新数组来对待(也是移动到最左边)
    这玩意存在的唯一意义可能就是便于实现而已,复杂度O(n^2),是稳定排序
第2章: MMU Notifier 全局通知器的核心原理⭐ 摘要 MMU Notifier机制是Linux内核中用于处理内存地址空间变化通知的关键框架。其设计遵循解耦与标准化、最小侵入性、高性能和安全性四大原则,采用三层架构实现上层应用、核心层与内存管理层的协作。框架提供两种通知模型:全局订阅的mmu_notifier和区间订阅的mmu_interval_notifier,分别适用于KVM虚拟化和GPU共享虚拟内存等不同场景。核心数据结构mmu_notifier_ops定义了设备驱动需要实现的回调函数集合,包括进程退出处理、页面老化管理、地址范围失效通知等功能。 阅读详情

相关推荐

CMake安装grpc生成gRPCTargets.cmake文件

以下是安装语句: cd grpc_folder git submodule update --init cmake .. make -j 4 sudo make install 然而编写依赖gRPC的程序,发现无法调用gRPC的CMake文件,错误提示如下所示: include could not find load file: /usr/local/lib/cmake/g...

2329

关于基本排序的总结选择排序: 算法是: ① 第1趟排序 在无序区R[1..n]中选出关键字最小的记录R[k],将它与无序区的第1个记录R[1]交换。 ③第i趟排序 第i趟排序开始时,当前有序区和无序区

快速排序: 采用的是分治思想 一趟快速排序的算法是: 1)设置两个变量i、j,排序开始的时候:i=0,j=N-1; 2)以第一个数组元素作为关键数据,赋值给key,即key=A[0]; 3)从j开始向前搜索,即由后开始向前搜索(j--),找到第一个小于key的值A[j],将A[j]赋给A[i]; 4)从i开始向后搜索,即由前开始向后搜索(i++),找到第一个大于key的A[i],将A[

qiuchang008的专栏 2318

c# U盘禁用---守护进程(插入,拔出,卸载等操作)

一、简介 传统的对U盘禁用,我们多采用修改注册表的方式,详情参考:https://blog.youkuaiyun.com/qq_25372599/article/details/79815407;本文将介绍一种其他的方式–后台守护程序。其原理非常简单:当守护程序检测到U盘的插入信号,我们自动卸载U盘,致使系统无法识别U盘,达到禁用U盘的效果。 二、程序设计 2.1 变量定义 strin...

星星之火燃亮码空 2846

【排序算法】经典排序算法之冒泡排序

冒泡排序很经典了,有人比喻过像是排序算法中的hello World,很贴切。 算法的基本思想是每次都需要两两比较大小。 算法描述 冒泡排序算法的过程如下:(从前往后) 1、比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2、对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 3、针对所有的元素重复以上的步骤,除了最后一个。 4、

wangzq的专栏 830

400G光模块测试全攻略:从PCS层到CMIS合规的避坑指南

本文为网络设备测试工程师和光通信研发人员提供了一份详尽的400G光模块测试实战指南。文章深入剖析了从PCS层信号完整性、FEC容限到CMIS管理接口合规性测试的全流程,并分享了ANLT协议分析、SerDes眼图调试以及系统级流量压力测试中的核心技巧与常见避坑点,旨在帮助读者构建一套高效、精准的测试体系,确保高速光模块的可靠性与性能。

weixin_29300931的博客 211

2021-8-14 EDK II编译

2021-8-14 EDK II 编译为什么要写这篇文章新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 为什么要写这篇文章 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdo

qq_45775660的博客 2946

9种常用排序算法总结(超详细)

以int型数据为例,且0号下标数组用来做为交换辅助空间,数据从1号下标开始存储 一、插入排序 基本思想:每一趟将一个待排序的记录,按其关键字的大小插入到已经排好序的一组记录的适当位置上,直到全部待排序记录全部插入为止。 直接插入排序 排序过程: 1、将待排序数组arr[1…n]看作两个集合,arr[1]为有序集合中元素,arr[2…n]为无序集合中元素,a[0]用来临时存放当前待排序记录 2、外层循环每次从无序集合中选择一个待插入元素(n-1次),每次使用顺序查找法,内层循环查找arr[i]在有序集合中的.

qq_39471489的博客 1万+

【大模型12步学习路线 · 第3步 · ③IC验证实战篇】SOTA Prompt 逐字拆解

本文拆解了4篇SOTA LLM4Verification论文的Prompt设计,重点分析了AssertLLM、RTLFixer等模型在IC验证领域的Prompt工程实践。AssertLLM通过任务分解为3个专用LLM(Spec分析、信号映射、SVA生成),结合领域RAG和定制System Prompt,将SVA准确率从GPT-4的8%提升至89%。RTLFixer采用ReAct框架实现98.5%的RTL语法错误修复率。文章总结了Prompt设计的关键技巧:任务分解、结构化输出、置信度评分、允许"不确定"标记

元直的博客 583

《啊哈算法》之桶排序

《啊哈算法》之桶排序 这是本人第一篇博客,简单记录一下学习的心得和体会。 以下是最简单的排序算法——桶排序的代码实现。下面分别是按从小到大排序以及按从大到小排序的代码``。 #include <stdio.h> int a[11]={0}; //定义一个数组来记录0~10出现次数。 int main(void) { int i,t,j; //定义三个变量 for(i=0;...

weixin_45423586的博客 305

无人机蜂群作战设计技术详解

构建防御网络,拦截敌方无人机或导弹;无人机蜂群作战设计技术是一种创新的军事应用概念,它基于生物仿生学原理,通过先进的通信技术、自主导航与决策算法,将大量小型、低成本、功能各异的无人机组织成一个高度协同的群体,以执行复杂多样的军事任务。无人机蜂群作战的概念源于自然界中蜜蜂、蚂蚁等生物群体的行为模式,这些生物群体通过简单的个体间的信息交互和分工协作,能够完成远远超出单一个体能力的复杂任务。其中,无人机群体是执行任务的主体,指挥控制系统负责任务分配和决策,通信数据链则保障无人机群体与指挥控制系统之间的信息交换。

专注多旋翼、复合翼无人机技术研究,从事低空经济行业。 2215

数据挖掘在人力资源分析中的实战案例

在当今竞争激烈的商业环境中,人力资源管理对于企业的成功至关重要。有效的人力资源管理能够提高员工绩效、降低员工流失率、优化人才招聘等。而数据挖掘技术为人力资源管理提供了强大的工具,通过对大量人力资源数据的分析,可以发现潜在的规律和模式,为企业的决策提供有力支持。本文的目的是通过实际案例展示数据挖掘在人力资源分析中的具体应用,涵盖员工绩效预测、人才招聘筛选、员工流失分析等多个方面。通过详细的案例分析,帮助读者理解数据挖掘技术在人力资源管理中的实际操作和应用价值。

移动开发前沿的博客 489

[記錄]排序算法--冒泡

一、冒泡排序 思路:兩兩比較相鄰記錄,如果反序則交換 冒泡排序時間複雜度最好爲O(n),最壞爲O(n^2) 實現: **********************************************************...

101

30 中望CAD二次开发(ZRX C++)-windows下的qt开发

本文介绍了中望CAD在windows下,如何使用qt开发插件界面,给出了具体的编码步骤,并生成了模态对话框和非模态对话框,其中非模态对话框可以调用CAD命令,实现交互操作。

cilvsuanna的博客 189

排序算法:冒泡排序及优化

冒泡排序算法详解以及对冒泡排序算法进行两个优化

doublecircle1的博客 2830

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

排序算法之冒泡排序

排序算法之冒泡排序 分析思路:冒泡排序,顾名思义就是像冒气泡一样,可以从前冒到后,也可以从后冒到前。这里以从后冒到前,从小到大排序举例:从最后一个值开始,不断将其与前一个值进行比较,如果后面的值比前面的值要小,那就进行交换,这样遍历一次之后,序列第一个位置就已经是最小的值了,如此循环,O(n2)之后就可以全部排好序。 编程思路: 顺序存储:如果序列为数组,我们可以采用两重for循环。第一重f...

贝勒里恩的博客 429

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

排序算法C++&&Python实现---冒泡排序

本文将介绍基本的冒泡排序算法及两种冒泡排序的优化算法。 一、基本冒泡排序算法 原理:对于待排序数列,从后到前依次比较相邻两个元素,若后面的元素小于前面的元素,则交换。(从小到大排序) C++实现 //打印排序结果函数 void Print(int a[],int n,int i=0) { //cout<<i<<endl; cout<<"排序后的结果为:"<<endl; for

Hello~~~ 846

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

排序算法基础:希尔排序

希尔排序法基本思想   希尔排序是把记录按下标的一定增量分组,对每组使用直接插入排序算法排序;随着增量逐渐减少,每组包含的关键词越来越多,当增量减至1时,整个文件恰被分成一组,算法便终止 希尔排序示意图: 希尔排序的动态示意图: 代码实现 1.交换式(效率低,较好理解) import java.util.Arrays; public class ShellSort { public static void main(String[] args) { int [] arr =

我不想学习但是必须学习 158

复习数据结构:排序算法(二)——冒泡排序

这篇复习冒泡排序。     冒泡排序也是一种稳定排序、内排序。     冒泡排序的基本思想:对当前还未排好序的范围内的全部数,自上而下对相邻的两个数依次进行比较和调整,让较大的数往下沉,较小的往上冒。即:每当两相邻的数比较后发现它们的排序与排序要求相反时,就将它们互换。 插入排序比冒泡排序快!     上面说的是普通的冒泡排序算法,时间复杂度是O(n^2),这种方法只能一趟排序

bigfacesafdasgfewgf 1497

JAVA四种基本排序

  JAVA四种基本排序,包括冒泡法,插入法,选择法,SHELL排序法.其中选择法是冒泡法的改进,SHELL排序法是 插入法的改进.所以从根本上来说可以归纳为两种不同的排序方法:即:插入法&冒泡法一 插入法:遍历排序集合,每到一个元素时,都要将这个元素与所有它之前的元素遍历比较一遍,让符合排序顺序的元素挨个移动到当前范围内它最应该出现的位置。交换是相邻遍历移动,双重循环控制实现.这种排序法属于地头

lzz313的学习轨迹 653

直接插入排序算法

1.基本思想 假设待排序的记录存放在数组 R[1..n]中。初始时,R[1]自成一个有序区,无序区为 R[2..n]。 从 i=2 起直至 i=n 为止,依次将 R[i]插入当前的有序区 R[1..i−1]中,生成含 n 个记录的有序区。 2.(1)简单方法 首先在当前有序区 R[1..i−1]中查找 R[i]的正确插入位置 k(1≤k≤i−1);然后将 R[k..i−1]中的记 录均后移一个位置,腾出 k 位置上的空间插入 R[i]。 注意:若 R[i]的关...

m0_59069522的博客 188

排序算法

排序是指将一个无序序列按某个规则进行有序排列。 1.冒泡排序:是排序算法中最基础的一种。 算法思想:冒泡排序的本质在于交换,即每次通过交换的方式把当前剩余元素的最大值移动到一段,而当剩余元素减少到0时,排序结束。 2. 选择排序:是最简单的排序算法之一。 简单选择排序:对于一个长度为n的序列,共需要n趟操作,每趟操作选出待排序部分[i,n]中最小的元素,令其与A[i]交换。因此总复杂度为O(n^2). 3. 插入排序 直接插入排序:进行n-1趟操作。假设某一趟,序列a的前i个元素已.

fionnguala1的博客 167

排序算法——冒泡排序

排序算法——冒泡排序

rookie_lbt的博客 375

十大排序算法之一——冒泡排序以及优化

详细讲解一下作者对冒泡排序的理解以及一系列的优化

2403_87685439的博客 804

简单的排序算法

冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。function bubbleSort(arr) { var len = arr.length; for (va...

文摘资讯 119

冒泡排序原理以及改进算法实现

1.算法的基本思想 冒泡排序是交换排序的一种,我们可以把将待排序的数组Arrray[0...n-1]理解成一个圆柱,将数组中的每一个元素都看成是重量为Array[i]的气泡,其中Array[0]在最上面 ,Array[n]在最下面。排序时候根据轻气泡在上重气泡在下的原则,自上而下扫描数组Array,遇到违反原则的气泡,就使其向下“下沉”,知道所有的气泡都是轻气泡在上重气泡在下,算法结束。 2.算法流程 1)初始时Array[0...n-1]无序,对n个元素序列进行n-1趟扫描。 2)...

qq_38289144的博客 2124

排序算法(插入排序、折半插入)

插入排序 1.给定待排序序列A[ 1.....n ],现假设A[1...i]已经有序,那么我们取出A[i+1]插入到序列A[1...i].这样有序序列记录数就增加了1.如此重复上述操作,不断取出记录插入有序序列,直到A[n]插入到有序序列,排序完成。 //直接插入排序 void straightInsertSort(int *a,int n) { int i,j; ...

weixin_34327761的博客 149
上一篇: 泛化的ScopeGuard模板类
下一篇: 重读Alpha-Beta算法
SolidusSnake
博客等级 码龄20年 1粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值