4月6号排序算法(2)

堆排序

讲堆排序之前我们需要了解几个定义

什么叫做最大堆,父亲节点,以及孩子节点

根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆。

 每个节点都是它的子树的根节点的父亲 。 反过来每个节点都是它父亲的孩子 。

下面讲一下思路:

第一步我们将待排序数组调整成最大堆的形式:父亲节点大于孩子节点(堆结构,父亲节点的下标为i,左孩子节点的下标为2*i+1,右孩子的节点下标为2*i+2)

第二步:我们将堆顶元素与待排序数组最后一个元素发生交换

第三步:待排序数组数据量减少一个,继续调整成最大堆形式。

代码如下

adjust函数
void adjust(int* nums, int start, int end) {int father = start;int child = 2 * father + 1;while (child <= end) {if ((child + 1) <= end && nums[child] < nums[child + 1]) {child++;}if (nums[child] > nums[father]) {swap(&nums[child], &nums[father]);father = child;child = 2 * father + 1;}else {break;//调整防止死循环}}
}堆函数
void heapsort(int* nums, int n) {//初始化堆(形成最大堆)//从最后一个父亲节点开始n/2-1;//一直调整到父亲节点为0;for (int i = n / 2 - 1; i >= 0; i--) {adjust(nums, i, n - 1);//i是父亲节点下标,n-1是最后一个元素}//堆顶与待排最后一个元素交换for (int j = n - 1; j >= 1; j--) {swap(&nums[0], &nums[j]);adjust(nums, 0, j - 1);}}

时间复杂度:O(nlogn),不稳定。

快速排序

在讲快排之前我们引入三色旗问题

解题思路:

第一步定义两个变量 i=start-1,j=end+1,从index=0的位置开始遍历。

分析

如果后边的元素比基准值大,那么我们不需要交换,只需要将遍历数组的下标index++既可,如果后边的元素比基准值小的话,我们需要交换元素的位置,基准值前边的我们都遍历过了所以不用再依次比较了

思考一下将三色旗问题引入到快速排序算法中呢,

我们需要确定一个基准值,暂且将待排序数组的一个元素设置为基准值。

第二步找到比基准值大,比基准值小的元素,将待排序数组分成三部分。一个比基准值小的数组,基准值,比基准值大的数组。进行进行分区处理。利用递归的思想。

代码如下

void quicksort(int*nums,int start,int end){if(start>=end)return;int i=start-1;int j=end+1;int index=start;int temp=nums[start];while(index<j){if(nums[index]<temp){swap(&nums[++i],&nums[index]);}else if(nums[index]>temp){swap(&nums[--j],&nums[index]);}else{index++;}}quicksort(nums,start,i);quicksort(nums,j,end);}

时间复杂度:

最好的情况为O(nlogn),最糟糕情况O(n^2);

稳定性:不稳定的。

归并排序

归并排序是用分治思想,三个步骤:

  • 分解(Divide):将n个元素分成个含n/2个元素的子序列。
  • 解决(Conquer):用合并排序法对两个子序列递归的排序。
  • 合并(Combine):合并两个已排序的子序列已得到排序结果。

将两个有序数组合并成一个有序数组

写一下代码

//归并排序
void merge(int*nums,int left,int mid,int right){int *temp=(int*)malloc(sizeof(int)*(right-left+1));int i=left;int j=mid+1;int index=0;while(i<=mid&&j<=right){if(nums[i]<=nums[j]){temp[index++]=nums[i++];}else{temp[index++]=nums[j++];}}while(i<=mid){temp[index++]=nums[i++];}while(j<=right){temp[index++]=nums[j++];}index=0;for(int i=left;i<right;i++){nums[i]=temp[index++];}free(temp);}
void merg(int*nums,int left,int right){if(left>=right)return;int mid=(right-left)/2+left;merg(nums,left,mid);merg(nums,mid+1,right);merge(nums.left,mid,right);
}

归并排序的时间复杂度:最好的情况:O(nlogn),

最坏的时候O(n^2)

稳定

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/596678.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

二维相位解包理论算法和软件【全文翻译- 质量分布图(3.3)】

在本节中,我们将定义几个在相位解包中非常有用的质量映射。质量图是定义给定相位数据中每个像素质量或好坏的数值数组。它们对于指导第 4 章将要介绍的几种路径跟踪算法是必要的,对于第 5 章将要介绍的一些加权 L^P-norm 算法也是必要的。 我们要讨论的第一个质量图是相关图,…

UART设计

一、UART通信简介 通用异步收发器&#xff0c; 特点&#xff1a;串行、异步、全双工通信 优点&#xff1a;通信线路简单&#xff0c;传输距离远 缺点&#xff1a;传输速度慢 数据传输速率&#xff1a;波特率&#xff08;单位&#xff1a;baud&#xff0c;波特&#xff09; …

4、双指针-移动零

首先不能复制&#xff0c;只能在原数组是哪个操作&#xff0c;那么很多集合的方式就不行了。当然在现实开发中肯定是可以的。目前按照题目来说是不可以的。所以我们可以思考下&#xff0c;是否可以通过交换来实现。 初始化一个变量 to 为 0。这个变量的目的是跟踪非零元素应该…

云计算存在的安全隐患

目录 一、概述 二、ENISA云安全漏洞分析 三、云计算相关系统漏洞 3.1 概述 3.2 漏洞分析 3.2.1 Hypervisor漏洞 3.2.1.1 CVE-2018-16882 3.2.1.2 CVE-2017-17563 3.2.1.3 CVE-2010-1225 3.2.2 虚拟机漏洞 3.2.2.1 CVE-2019-14835 3.2.2.2 CVE-2019-5514 3.2.2.3 CV…

观测线程的工具——jconsole

joconsole的简单使用 joncole位置在jdk/bin路径中&#xff0c;在进入路径后可以查找到jconsole.exe的应用程序。如图&#xff1a; 双击创建jconsole进程&#xff0c;可以在里面选择所要观测的java文件。 以我的代码为例&#xff1a; class MyThread extends Thread {Overrid…

(一)基于IDEA的JAVA基础11

为什么使用多重循环 有时单独一个循环不能满足我们的要求&#xff0c;我们就要使用多重循环&#xff0c;这不废话吗。 多重循环的使用: 一般我们使用多重循环都是双重for循环&#xff0c; 语法: for(循环条件){ 循环操作1&#xff1b; for(循环条件2){ 循环操作2&#x…

Struts2的入门:新建项目——》导入jar包——》jsp,action,struts.xml,web.xml——》在项目运行

文章目录 配置环境tomcat 新建项目导入jar包新建jsp界面新建action类新建struts.xml,用来配置action文件配置Struts2的核心过滤器&#xff1a;web.xml 启动测试给一个返回界面在struts.xml中配置以实现页面的跳转&#xff1a;result再写个success.jsp最后在项目运行 配置环境 …

post请求搜索功能爬虫

<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> <version>4.5.2</version> </dependency>…

HTTP 摘要认证

文章目录 一、什么是摘要认证二、工作流程三、实例演示 一、什么是摘要认证 摘要认证&#xff0c;即 Digest Access Authentication&#xff0c;是一种HTTP身份验证机制&#xff0c;用于验证用户的身份。相较于基本认证&#xff08;Basic Authentication&#xff09;使用用户名…

相机标定——四个坐标系介绍

世界坐标系(Xw,Yw,Zw) 世界坐标系是一个用于描述和定位三维空间中物体位置的坐标系&#xff0c;通常反映真实世界下物体的位置和方向。它是一个惯性坐标系&#xff0c;被用作整个场景或系统的参考框架。在很多情况下&#xff0c;世界坐标系被认为是固定不变的&#xff0c;即它…

解码mp4文件分别存储为pcm,yuv文件

// 解码分别写入对应文件 #include "myLog.h" #include <iostream>extern "C" { #include <libavformat\avformat.h> #include <libavutil\avutil.h> #include <libavcodec\avcodec.h> #include <libavutil\imgutils.h> #in…

华为ensp中高级acl (控制列表) 原理和配置命令 (详解)

作者主页&#xff1a;点击&#xff01; ENSP专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年4月6日23点18分 高级acl&#xff08;Access Control List&#xff09;是一种访问控制列表&#xff0c;可以根据数据包的源IP地址、目标IP地址、源端口、目标端口、协议…