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

选择排序与堆排序

 博主主页: 码农派大星.

    数据结构专栏:Java数据结构

 数据库专栏:MySQL数据库

关注博主带你了解更多数据结构知识


1.选择排序

第一种方法:直接定义一个 i下标 j下标(j=i+1) ,再定义minIdex下标 让 minIdex == i, 开始遍历数组,过程中 如果j下标的值大于minIdex下标的值就交换,然后i++,j++.

 private static void swap(int[] arrary,int i,int j){int tmp = arrary[i];arrary[i] = arrary[j];arrary[j] = tmp;}public static void selectSort1(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,minIndex,i);}
return arrary;}

第二种方法:

每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完 。

在元素集合array[i]到array[n-1]中选择关键码最大(小)的数据元素 若它不是这组元素中的最后一个(第一个)元素,则将它与这组元素中的最后一个(第一个)元素交换 在剩余的array[i]--array[n-2](array[i+1]--array[n-1])集合中,重复上述步骤,直到集合剩余1个元素.

选择排序效果图

 private static void swap(int[] arrary,int i,int j){int tmp = arrary[i];arrary[i] = arrary[j];arrary[j] = tmp;}public static void selectSort2(int[] array){int left = 0;int right = array.length -1;while (left < right){int mindIndex = left;int maxIndex = left;for (int i = left+1; i <= right; i++) {if (array[i] < array[mindIndex]) {mindIndex = i;}if (array[i] > array[maxIndex]) {maxIndex = i;}}swap(array,mindIndex,left);if (maxIndex == left) {maxIndex = mindIndex;}swap(array,maxIndex,right);left++;right--;}
return arrary;}

总结:

1. 直接选择排序思考非常好理解,但是效率不是很好。

2. 时间复杂度:O(n^{2})

3. 空间复杂度:O(1)

4. 稳定性:不稳定

2.堆排序

堆排序(Heapsort)是指利用堆积树(堆)这种数据结构所设计的一种排序算法,它是选择排序的一种。它是通过堆来进行选择数据。需要注意的是排升序要建大堆,排降序建小堆。

 private static void createBigHeap(int[] array) {for (int parent = (array.length-1-1) / 2; parent >= 0; parent--) {siftDown(parent,array,array.length);}}private static void siftDown(int parent,int[] array,int end) {int child = 2*parent+1;while (child < end) {if(child + 1 < end && array[child] < array[child+1]) {child++;}//child下标 就是左右孩子最大值的下标if(array[child] > array[parent]) {swap(array,child,parent);parent = child;child = 2*parent+1;}else {break;}}}public static void heapSort(int[] array) {createBigHeap(array);int end = array.length-1;while (end >= 0) {swap(array,0,end);siftDown(0,array,end);end--;}}

总结:

1. 堆排序使用堆来选数,效率就高了很多。

2. 时间复杂度:O(N*logN)

3. 空间复杂度:O(1)

4. 稳定性:不稳定

相关文章:

  • Rust开源Web框架Salvo源码编译
  • Vue中引入组件需要哪三步
  • PostgreSQL的扩展(extensions)-常用的扩展之pg_store_plans
  • Windows系统使用Docker部署Focalboard团队协作工具详细流程
  • 521源码-免费下载-WordPress全能自动采集与发布插件 – WP-AutoPostPro 汉化版
  • Docker搭建mysql性能测试环境
  • 授人以渔 选购篇十四:电动车(电动自行车)选购要点
  • 重生之while在鸣潮学习HTML标签
  • 【ai】pycharm设置软件仓库编译运行基于langchain的chatpdf
  • 疯狂“造人”!美国两党共推新法案,5年培养100万AI及量子人才
  • 推荐3款好用的AI智能写作工具
  • 【算法专题】双指针算法之 移动零
  • Qt for android 串口库使用
  • 国产32位MCU的发展与机遇
  • 【数组】Leetcode 57. 插入区间【中等】
  • 2019.2.20 c++ 知识梳理
  • const let
  • download使用浅析
  • Druid 在有赞的实践
  • es6要点
  • extract-text-webpack-plugin用法
  • javascript 总结(常用工具类的封装)
  • Java编程基础24——递归练习
  • js
  • SpiderData 2019年2月13日 DApp数据排行榜
  • SSH 免密登录
  • 阿里云购买磁盘后挂载
  • 使用前端开发工具包WijmoJS - 创建自定义DropDownTree控件(包含源代码)
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • FaaS 的简单实践
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​马来语翻译中文去哪比较好?
  • ​直流电和交流电有什么区别为什么这个时候又要变成直流电呢?交流转换到直流(整流器)直流变交流(逆变器)​
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • # include “ “ 和 # include < >两者的区别
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • $.extend({},旧的,新的);合并对象,后面的覆盖前面的
  • (javascript)再说document.body.scrollTop的使用问题
  • (ZT)薛涌:谈贫说富
  • (每日持续更新)jdk api之StringBufferInputStream基础、应用、实战
  • (转载)微软数据挖掘算法:Microsoft 时序算法(5)
  • .axf 转化 .bin文件 的方法
  • .NET Framework与.NET Framework SDK有什么不同?
  • .Net IE10 _doPostBack 未定义
  • .NET/MSBuild 中的发布路径在哪里呢?如何在扩展编译的时候修改发布路径中的文件呢?
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • [20150904]exp slow.txt
  • [Algorithm][动态规划][两个数组的DP][正则表达式匹配][交错字符串][两个字符串的最小ASCII删除和][最长重复子数组]详细讲解
  • [C#]C# winform实现imagecaption图像生成描述图文描述生成
  • [Kubernetes]9. K8s ingress讲解借助ingress配置http,https访问k8s集群应用
  • [leveldb] 2.open操作介绍
  • [LLM][FT]大模型Fine-Tuning相关技术0
  • [NET].NET Framework 3.5 SP1 真正的离线安装(转)