[笔记]数据结构

news/2024/12/22 2:27:33/

文章目录

  • 堆排序
  • 215 数组中第k个最大元素

堆排序

堆排序方法对于记录数较少的文件并不值得提倡,但对n较大的文件还是有效
运行时间主要耗费在:

  1. 建立初始堆
  2. 调整建立新堆 反复筛选

筛选算法进行的关键字比较次数至多为: 2 ( k − 1 ) 2(k-1) 2(k1)
最坏情况O(nlogn),仅需一个记录大小供交换用的辅助存储空间

堆采用线性表表示
typedef SqList HeapType;
void HeadAdjust(HeapType &H,int s,int m){//已知H.r[s..m]中记录关键字除H.r[s].key之外均满足堆的定义//本函数调整H.r[s]的关键字,使H.r[s..m]成为一个大顶堆//s最大的非叶子节点 rc = H.r[s]; //辅助元素记录最大非叶子节点for(j=2*s;j<=m;j*=2){//2*s末尾元素//沿key较大的孩子结点向下筛选if(j<m && LT(H.r[j].key,H.r[j+1].key))++j;//j为key较大的记录的下标if(!LT(rc.key,H.r[j].key))break;//叶子节点大于等于非叶子节点,不需要调整(大根堆)//需要调整,将叶子节点和非叶子节点【已经记录】交换H.r[s]=H.r[j];s=j;}H.r[s]=rc;//插入元素}//HeadAdjustvoid HeadAdjust(int A[],int i,int m){//易懂版本A[0]=A[j];for(j=2*i;j<=m;j*=2){//2*s末尾元素//沿key较大的孩子结点向下筛选if(j<m && A[j]<A[j+1])++j;//j为key较大的记录的下标if(A[0]>=A[j])break;//叶子节点大于等于非叶子节点,不需要调整(大根堆)//需要调整,将叶子节点和非叶子节点【已经记录】交换A[i]=A[j];i=j;}A[i]=A[0];
}
void HeapSort(HeapType &H){//对顺序表H进行排序for(i=H.length/2;i>0;--i){HeapAdjust(H,i,H.length);//把H.r[1...H.length]建成大顶堆}for(i=H.length;i>1;--i){swap(H.r[1],H.r[i]);//将堆顶记录和当前未经排序子序列Hr[1...i]中//最后一个记录相互交换HeapAdjust(H,1,i-1);//将H.r[1..i-1]重新调整为大顶堆}
}//HeapSort
  最大堆:priority_queue<int, vector<int>, less<int>> maxHeap;最小堆:priority_queue<int, vector<int>, greater<int>> minHeap;如果使用 priority_queue<int> 创建堆,默认创建的是最大堆;最小堆会在一些图算法中应用,比如prim,dijkstra算法等,

链接

在这里插入图片描述

class Solution {
public:int mySqrt(int x) {if(x<=1)return x;int left=1,right=x/2;while(true){int mid = (left+right)/2;if(mid>0&&mid>x/mid)right=mid-1;else if((mid+1)>x/(mid+1))return mid;else left=mid+1;  }}
};

215 数组中第k个最大元素

在这里插入图片描述
方法一:利用快速排序进行划分

class Solution {
public:int findKthLargest(vector<int>& nums, int k) {return divide(nums,0,nums.size()-1,nums.size()-k);}int divide(vector<int>& nums,int left,int right,int k){if(left==right)return nums[k];int partition = nums[left],i=left-1,j=right+1;while(i<j){while(nums[++i]<partition);while(nums[--j]>partition);if(i<j)swap(nums[i],nums[j]);}if(k<=j)return divide(nums,left,j,k);else return divide(nums,j+1,right,k);}
};

http://www.ppmy.cn/news/1530944.html

相关文章

FPGA题目记录2

1、下列总线中属于AMBA总线的是&#xff1a;&#xff08;D&#xff09; A、SPI B、PCIe C、I2C D、ASB AMBA是由ARM公司研发推出的一种高级微控制器总线架构(Advanced Microcontroller Bus Architecture)。其中AMBA包含了四种不同的总线标准&#xff0c;分别是&#xff1a;AHB…

WPF DataGrid 动态修改某一个单元格的样式

WPF DataGrid 动态修改某一个单元格的样式 <DataGrid Name"main_datagrid_display" Width"1267" Height"193" Grid.Column"1"ItemsSource"{Binding DataGridModels}"><DataGrid.Columns><!--ElementStyle 设…

解决在Nignx下Thinkphp路由不生效问题

Nignx下Tp框架路由不生效 问题的原因在于ThinkPHP通过URL后缀匹配方法&#xff0c;默认没有后缀会尝试访问默认的index方法。 解决方案&#xff1a;在URL末尾添加/后缀或者修改路由配置文件route.php中的规则。 如果还是没解决建议换apache

Leetcode算法基础篇-位运算

简介 学习链接&#xff1a;位运算&#xff08;第 13 ~ 14 天&#xff09; 位运算规则 运算符描述规则|按位或运算符只要对应的两个二进位有一个为 1 1 1 时&#xff0c;结果位就为 1 1 1。&按位与运算符只有对应的两个二进位都为 1 1 1 时&#xff0c;结果位才为 1 …

如何进行光伏项目卫星踏勘?

一、卫星地图选址 1. 数据获取 卫星踏勘的第一步是获取高分辨率的卫星图像。利用卫星遥感技术&#xff0c;可以获取项目候选区域的地形地貌、植被覆盖等详细信息。这些数据通过专业的遥感图像处理软件进行分析和解译&#xff0c;提取出对光伏电站建设有重要影响的关键因素&am…

柯桥小语种学习之语言交流 | 德语餐厅用语

01 一、入座与点餐 1. Guten Tag! Ein Tisch fr zwei Personen, bitte.&#xff08;你好&#xff01;请给我们一张两人桌。&#xff09; 2. Knnen wir hier sitzen?&#xff08;我们可以坐这里吗&#xff1f;&#xff09; 3. Die Speisekarte, bitte.&#xff08;请给我菜…

AI大模型助力数据消费,构建数据飞轮科学、高效的体系

随着互联网的技术高速发展&#xff0c;越来越多的应用层出不穷&#xff0c;伴随着数据应用的需求变多&#xff0c;为快速响应业务需求&#xff0c;很多企业在初期没有很好的规划的情况下&#xff0c;存在不同程度的烟囱式的开发模式&#xff0c;这样会导致企业不同业务线的数据…

Debezium日常分享系列之:将容器镜像移至 quay.io

Debezium日常分享系列之&#xff1a;将容器镜像移至 quay.io 在Debezium 3.0.0.Final发布之后&#xff0c;我们将不再向docker.io发布容器镜像更新。旧版本的Debezium 2.x和1.x镜像将继续保留在docker.io上&#xff1b;然而&#xff0c;所有未来的Debezium 2.7.x和3.x或更高版本…