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

排序算法---(四)

引言

在前几篇文章里面讲到了六种排序,今天来讲一下剩下两种:基数排序、堆排序

基数排序

1.思路

(1)首先确定最大数的位数:找到待排序数组中的最大数,并确定其位数

(2)将元素按照相应的位数存入桶中:先定义一个桶(二维数组):用来存放待排序数组元素,再定义一个桶计数器(一维数组):用来记录每个桶里面有几个元素,将元素放入桶中有三步:① 放哪个桶(看相应位数是多少,例如相应位数上是1,那么就放在x坐标为1的桶里)、② 找到桶应该放在桶内的哪个位置(因为相应位数上是同一个数字的可能有多个,因此桶计数器发挥作用了,若计数为3,那说明这个桶已经放了三个元素了,那将待放入元素放在第四个位置上)、③ 更新桶计数器(+1);

(3)相应位数排完序后,将存入桶里元素有序的放回原数组

2.代码

public class jsSort { public static void main(String[] args) { int[] arr=new int[]{5,1,3,9,8,2}; int n=arr.length; sort(arr); for(int i=0;i<n;i++){ System.out.print(arr[i]+" "); } } public static void sort(int[] arr) { int max=arr[0]; for(int i=0;i<arr.length;i++){ if(arr[i]>max){ max=arr[i]; } } int maxLength=(max+"").length(); int[][] bucket=new int[10][arr.length]; int[] bucketCount=new int[10]; int t=1; for(int i=0;i<maxLength;i++){ //存数据 for(int j=0;j<arr.length;j++){ int element=arr[j]/t%10; bucket[element][bucketCount[element]]=arr[j]; bucketCount[element]++; } int index=0; //取数据 for(int k=0;k<10;k++){ if(bucketCount[k]!=0){ for(int j=0;j<bucketCount[k];j++){ arr[index++]=bucket[k][j]; } } bucketCount[k]=0; } t=t*10; } } }

堆排序

1.相关知识

完全二叉树:从上到下、从左到右依次填满结点,前面每一层必须是满的,最后一层可以不满,但只能缺右边的结点,不能中间空、不能左边空

大顶堆:在完全二叉树的基础上父节点的值大于左右孩子的值

2.思路

(1)首先将待排序数组构造成一个大顶堆,此时整个数组最大值就被放在了二叉树的顶端

(2)将堆顶元素和堆底元素进行交换,此时堆底元素变成了整个数组最大值

(3)重新构建大顶堆,不包含上一步的堆底元素(最大值),重复上述步骤,这样就实现了每次都把最大元素拿出来,实现了数组升序

3.关键点

构造大顶堆:从最后一个元素当作parent,首先判断是否有孩子:child=parent*2+1是否小于nums.length,直到找到符合条件的parent,找到后开始判断parent和child哪个大,大的换到parent位置,依次遍历,遍历到二叉树的最顶端(数组的第一个元素),这样不断地向上遍历并交换,就实现了堆顶元素是数组最大的元素

排除上一轮的堆底元素:只需要将待排序数组长度减一即可

4.代码

public class heapSort { public static void main(String[] args) { int[] arr=new int[]{5,1,3,9,6,8,2}; for(int i=arr.length-1;i>=0;i--){ sort(arr,i,arr.length); } //交换堆顶元素和堆底元素,并排除堆底元素 for(int k=arr.length-1;k>=0;k--){ int temp=arr[k]; arr[k]=arr[0]; arr[0]=temp; sort(arr,0,k); } //循环输出 for(int j=0;j<arr.length;j++){ System.out.print(arr[j]+" "); } } public static void sort(int[] arr,int parent,int length){ int child=parent*2+1; while(child<length){ int rChild=child+1; if(rChild<length && arr[rChild]>arr[child]){ child++; } //将大的元素放在parent位置 if(arr[child]>arr[parent]){ int temp=arr[child]; arr[child]=arr[parent]; arr[parent]=temp; parent=child; child=parent*2+1; }else{ break; } } } }

小舟有话说

至此,八大排序已全部讲解完毕,其中要求我们熟练掌握的有三种排序:冒泡排序、快速排序、堆排序,大家一定要熟练记忆,堆排序虽然看起来难理解,但是只要懂了二叉树相关知识就不难。

如果觉得内容不错,那就点点赞,点点关注吧,下次找我不迷路~

http://www.jsqmd.com/news/554185/

相关文章:

  • yz-bijini-cosplay常用Linux命令大全:运维必备技能
  • 跨平台协作:OpenClaw+nanobot实现Mac与Windows间的任务接力
  • 2026重庆无缝钢管定制精选:专业定制,服务热线速查,50 声测管/建筑声测管/卷制钢护筒/护筒,无缝钢管现货联系电话 - 品牌推荐师
  • Czkawka视频查重:释放硬盘空间的高效解决方案
  • 告别盲调!手把手教你用EB Tresos配置MCAL的Icu模块,精准捕获PWM占空比
  • 告别算法烦恼!用MAX30102 T03模块5分钟搞定Arduino心率血氧监测(附完整代码)
  • S32K144 SDK实战:从Bootloader到APP的无缝跳转实现
  • 别再只卷CNN了!用强化学习(RL)给YOLOv5打个辅助,实现工业零件精准定位(附PyTorch代码)
  • 2026年西安热门婚纱摄影品牌排名,新中式风格婚纱照靠谱推荐哪家 - myqiye
  • Mac鼠标增强工具深度演进:从2.2.5到3.0.8的架构变革与技术剖析
  • 大活络丸、牛黄清心丸闲置变现难?本草拾光上门全收 - 品牌排行榜单
  • Go 内存逃逸调试指南
  • 3步颠覆传统流程的教育资源获取利器:电子课本智能解析工具全攻略
  • BiliTools哔哩哔哩工具箱:5分钟搞定B站资源高效下载的完整解决方案
  • 图像标注难题如何破解?LabelImg工具全面解析与实战指南
  • 2026南京换玻璃|高端腕表表镜维修全科普 多品牌故障解析+六城正规网点 - 时光修表匠
  • 2026年盘点厦门靠谱的股权评估公司,经验丰富的财税服务值得选 - mypinpai
  • OptiScaler:打破硬件壁垒,让所有显卡享受DLSS级画质优化
  • DCNv4实战解析:如何通过可变形卷积优化视觉任务性能
  • RDF实战指南:从入门到精通
  • 安宫牛黄丸别闲置!本草拾光高价回收,上门鉴定当场结算 - 品牌排行榜单
  • 别再暴力截断了!用LangChain的RecursiveCharacterTextSplitter优雅处理中文文档分块
  • 深度学习项目训练环境开源可部署:支持中小企业本地GPU集群的轻量级训练平台
  • 2026年艺术培训GEO优化服务商实力分析:从效果到口碑的实战选型指南 - 小白条111
  • 2026年42寸安卓户外一体机厂家盘点,价格实惠的怎么选 - 工业品网
  • DeOldify赋能内容创作:AIGC短视频背景素材生成实践
  • 家里闲置老药丸别乱扔!本草拾光上门回收,高价变现更省心 - 品牌排行榜单
  • 3个关键技巧优化华硕笔记本性能:GHelper完全指南
  • Flutter开发踩坑记:CocoaPods安装失败全流程解决方案(含Ruby版本升级)
  • 毫米波雷达ADC选型避坑指南:如何根据带宽和帧率确定快/慢时间采样参数?