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

算法day05 master公式估算递归时间复杂度 归并排序 小和问题 堆排序

2.认识O(NlogN)的排序_哔哩哔哩_bilibili

         master公式

        有这样一个数组:【0,4,2,3,3,1,2】;假设实现了这样一个sort()排序方法,

将数组二分成左右两等分,使用sort()对左右两个小数组进行排序,就满足master公式的使用;

或者将数组平均分成三等分,n等分,都满足master公式。



      归并排序

                  

 小和问题

        原数组一分为二,左数组内部求和,右数组内部求和,左右数组比较求和,将三部分小和相加求和。

        左数组内部求和,右数组内部求和的过程就是原数组一分为二小和相加求和的过程。

        问题一:

                定义一个左边界,左指针

                遍历数组,从数组第一个元素开始比较:

                        如果比num值大直接跳过,

                        如果比num值小将边界长度+1,指针右移1位

                直到下标越界,就实现了遍历一遍整个元素时间复杂度o(n),空间复杂度0(1)

        问题二:

                定义一个左边界,左指针,右边界,右指针;

                从数组第一个元素开始比较: 默认先调用左指针

                        如果比num值大将右边界长度+1,右指针左移1位,调用右指针

                        比num值小将左边界长度+1,左指针右移1位,调用左指针。

                直到左右指针相遇。

                



        堆排序

         定义:         

                  通过堆排序算法实现将给定的数组元素按大小构建一个完全二叉树,并且二叉树分为最大堆和最小堆两种类型。

                  最大堆每颗树的父节点是当前树的最大值或者最大值之一;

                  最小堆每棵树的父节点是当前树的最小值或者最小值之一。

         举例:

                  有这样一个数组:

                                 int [ ] n = {0,99,2,2,3};

                  父节点下标father和子节点下标son总满足这样的关系:

                                son =  (father+1)/ 2  或者  

                                son =  (father+2)/ 2  或者  

                                father = (son-1)  /  2      或者 

                                father = (son-2)  /  2 

                                

        思路:

                对于数组每一个值都满足堆排序的定义,那它就是一个最大堆或者最小堆。

                反过来说遍历数组每一个值进行堆排序,最终就能得到最大或最小堆。

                heapify() 堆排序方法

                      1) 对于某一颗树,对比父节点和左右节点,如果最大值还是父节点,那这颗树什么都不需要改变,就是一个最大堆;

                      2)  如果发生左右节点 比 父节点 值大的情况,最大值max给父节点,原父节点值father下来给子节点。

                                这时还要考虑子节点father是不是还要向下移动 ,因为从数组后往前进行heapify(),前面的值还没进行heapify()预先还不知道具体情况和值就被拽下来。

       

        实现代码

public class HeapSort {public static void sort(int[] sort){for(int i =(sort.length - 1) / 2 ; i >= 0; i--) {heapify(sort,i,sort.length);}}public static void  heapify(int[] arr ,int index ,int heapLenth){int max = index;while(true){int left = index*2 +1;int right = left +1;if (left < heapLenth && arr[left]> arr[index]){max = left;}if (right < heapLenth && arr[right] > arr[max]){max = right;}if (max==index)break;swap(arr,max,index);index = max;}}//    public static void heapinsert(int[] nums, int index){
//        if (nums.length<=1)return;
//
//
//        while(true){
//        if (nums[index] > nums [(index-1)/2]){
//            swap(nums,index,(index-1)/2);
//        }else {
//            index++;
//        }
//        if (heapLenth<nums.length){
//            heapLenth++;
//            index = (index-1)/2;
//        }else {
//            break;
//        }
//        }
//
//    }public static void swap(int[] nums,int index, int otherIndex){int temporary = nums[index];nums[index] = nums[otherIndex];nums[otherIndex] = temporary;}public static void main(String[] args) {int[] n = {0,99,2,2,3};
//        int[] n = {0,1,2};
//        heapinsert(n,0);sort(n);System.out.println(Arrays.toString(n));}
}

               输出结果为 [ 99 , 3 , 2  , 2  , 0 ] 

 

http://www.lryc.cn/news/404582.html

相关文章:

  • 基于jeecgboot-vue3的Flowable流程仿钉钉流程设计器-支持VForm3表单的选择与支持
  • 【刷题汇总 -- 压缩字符串(一)、chika和蜜柑、 01背包】
  • 《Exploring Aligned Complementary Image Pair for Blind Motion Deblurring》
  • vue2学习笔记9 - 通过观察vue实例中的data,理解Vue中的数据代理
  • 04 Git与远程仓库
  • 数据库之表的查询
  • String 和StringBuilder字符串操作快慢的举例比较
  • Java代码基础算法练习-竞猜卡片值-2024.07.22
  • Python爬虫-淘宝搜索热词数据
  • Leetcode二分搜索法浅析
  • 昇思25天学习打卡营第24天|ResNet50迁移学习
  • Shell 构建flutter + Navtive 生成IPA
  • python gradio 的输出展示组件
  • SwiftUI 6.0(Xcode 16)新 PreviewModifier 协议让预览调试如虎添翼
  • STM32被拔网线 LWIP的TCP无法重连解决方案
  • Linux下开放指定端口
  • 亚马逊测评行为的识别与防范:教你如何搭建安全的测评环境
  • 如何通过成熟的外发平台,实现文档安全外发管理?
  • SCI一区级 | Matlab实现SSA-CNN-GRU-Multihead-Attention多变量时间序列预测
  • Mysql中的几种常见日志
  • 2024年7月22日(nfs samba)
  • 黑龙江网络安全等级保护测评策略概述
  • 笔记 7 :linux 011 注释,函 bread () , get_hash_table () , find_buffer ()
  • vscode配置latex环境制作【文档、简历、resume】
  • 如何学习Spark:糙快猛的大数据之旅
  • 交换机(Switches)和桥(Bridges)的区别
  • 基于springboot+vue的汽车租赁管理系统
  • 《0基础》学习Python——第二十二讲__网络爬虫/<5>爬取豆瓣电影封面图
  • 全新UI自助图文打印系统小程序源码/自助云打印机前后端源码
  • yolo5图片视频、摄像头推理demo