排序算法 下

1.快速排序

快速排序是Hoare在1962年提出的一种二叉树结构的交换排序的方法,采用了递归的思想

思想:任取待排序的元素序列中的某元素作为基准值,按照原来的顺序将序列分为两个子序列,

左子序列中的所有元素均小于基准直,右子树的所有序列中的元素均大于基准直,然后左右子序列重复该过程,直到所有元素都排在相应的位置上。

先写出大致的框架,与二叉树的前序遍历非常之像,写递归框架可以照着二叉树前序遍历写出来,

后续只要分析如何按照基准直对区间中的数据划分即可

public static void  QuickSort(int[] array,int start,int end){//递归结束的条件if(start >= end){return;}//如果子区间的数据越来越少了,直接采用 范围插入排序 更快if(end-start+1 < 10){insertSort(array,start,end);return;}//三数取中原因://如果这个序列是接近有序的,1 2 3 4 5 6 7 8 9 11 10//基准值一般选取最左侧的数据 1,那么每次递归1的左侧没有子序列,只有右侧//所以会大大提高时间复杂度,//那么就取最左,最有,最中三个数据的中位数,//将中位数与第一个数交换,这样返回的基准直就不是1了,而是与1交换的数int index = midTreeNum(array,start,end);swap(array,start,index);//寻找基准直位置的下标//该方法有很多种,等下面我们一一介绍int par = paririon(array,start,end);//按照基准直,将其左右两个子区间进行排序QuickSort(array,start,par-1);QuickSort(array,par+1,end);}//挖坑法private static int paririon(int[]array,int left,int right){int temp = array[left];while (left < right){while (left < right && array[right]<=temp){right--;}array[left] = array[right];while (left < right && array[left] > temp){left++;}array[right] =array[left];}array[left] = temp;return left;}//找到中间值的下标private static int midTreeNum(int[]array,int left,int right){//中间位置下标int mid = left+(right-left)/2;if(array[left]<array[right]){if(array[mid]<array[left]){return left;}else  if(array[mid]>array[right]){return right;}else {return mid;}}else {if(array[mid]>array[left]){return left;}else if(array[mid]<array[right]){return right;}else {return mid;}}}private static void insertSort(int[]array,int left,int right){for(int i=left+1;i<=right;i++){int temp = array[i];int j = i-1;for(;j>=0;j--){if(array[j] > temp){array[j+1] = array[j];}else {break;}}array[j+1] = temp;}}

paririon 方法使用用来找到基准直的,通过找到的基准直将序列化分为两个子区间,再通过递归不断排序,缩小子区间,直到子区间就一个数字。

int index = midTreeNum(array,start,end);

这条语句什么意思? 就是取到三个数的中位数

三数取中原因:
如果这个序列是接近有序的,1 2 3 4 5 6 7 8 9 11 10
基准值一般选取最左侧的数据 1,那么每次递归1的左侧没有子序列,只有右侧
所以会大大提高时间复杂度,
那么就取最左,最有,最中三个数据的中位数,
将中位数与第一个数交换,这样返回的基准直就不是1了,而是与1交换的数

上面查找基准值的paririon方法是挖坑法

下面例举Hoare法查找基准值

//Hoare法private static int paririon2(int[]array,int left,int right){int i = left;int temp = array[left];while (left < right){while (left < right && array[right] >= temp){right--;}while (left < right && array[left]<=temp){left++;}swap(array,left,right);}swap(array,left,i);return left;}

快速排序总结:

1.整体综合性能与使用场景都是比较好的,才敢较快排

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

3.空间复杂度:O(logN);

4.稳定性:不稳定


2.归并排序

建立在归并操作上的有效排序算法,该算法采用分治法的一个典型的应用。将已有的子序列合并,得到完全有序的序列。

使每个子序列有序,再使每个子序列之间有序。

归并排序:

更多是解决磁盘中的外排序问题。

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

空间复杂度:O(N)

稳定性:稳定

代码实现

//归并排序public static void mergeSort(int[]array){megeFun(array,0,array.length-1);}public static void megeFun(int[]array,int left,int right){if(left >=right){return;}//分解int mid = left+(right-left)/2;megeFun(array,left,mid);megeFun(array,mid+1,right);//合并merge(array,left,mid,right);}public static void merge(int[]array,int left,int mid,int right){int[] temp = new int[right-left+1];int sl = left;int el = mid;int sr = mid+1;int er = right;int k = 0;while (sl<=el && sr<=er){if(array[sl] <= array[sr]){temp[k++] = array[sl++];}else{temp[k++] = array[sr++];}}while (sl<=el){temp[k++] = array[sl++];}while (sr<=er){temp[k++] = array[sr++];}for (int i = 0; i < k; i++) {array[i+left] = temp[i];}}


3.计数排序

又叫做鸽巢原理,是对哈希直接定址法的变形应用

1.统计相同元素的出现的次数

2.根据统计结果将序列收回到原来的序列中

时间复杂度:O(max(N,范围))

空间复杂度:O(范围)

稳定性:稳定

代码:

public static void countSort(int[]array){//遍历数组找到最大最小值int mindex= array[0];int maxdex = array[0];for (int i = 0; i < array.length; i++) {if(maxdex<array[i]){maxdex = array[i];}if(mindex>array[i]){mindex = array[i];}}//已经找到最大与最小值了,定义数组int[]count = new int[maxdex-mindex+1];for (int i = 0; i < array.length; i++) {int val = array[i]-mindex;count[val]++;}//count数组以数据为下标,出现的次数为值int index = 0;//array的下标for (int i = 0; i < count.length ; i++) {while (count[i]>0){array[index] = i+mindex;index++;count[i]--;}}}

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

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

相关文章

Python-VBA函数之旅-sum函数

目录 一、sum函数的常见应用场景 二、sum函数使用注意事项 三、如何用好sum函数&#xff1f; 1、sum函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a; https://myelsa1024.blog.csdn.net/ 一、sum函数的常…

CSS:盒子模型

目录 ▐ box—model概述 ▐ 盒子的组成 ▐ 内容区 ▐ 内边距 ▐ 边框 ▐ 外边距 ▐ 清除浏览器默认样式 ▐ box—model概述 • CSS处理网页时&#xff0c;它认为每个标签都包含在一个不可见的盒子里. • 如果把所有的标签都想象成盒子&#xff0c;那么我们对网…

如何判断一个元素是否在可视区域中

可视区域就是我们浏览网页的设备肉眼可见的区域。 在开发总&#xff0c;我们经常需要判断目标元素是否在可视区域内或者可视区域的距离小于一个值&#xff0c;从而实现一些常用的功能&#xff0c;比如&#xff1a; 图片懒加载列表的无限滚动计算广告元素的曝光情况可点击链接…

记一次requests.get()返回数据乱码问题

现象 使用requests.get()请求&#xff0c;添加了header, 返回的数据使用了text接收&#xff1b;打印出来发现是乱码&#xff1b; 尝试解决 1、 设置encoding ret requests.get(url,headersheaders).text ret.encoding utf-8方法不生效&#xff1b; 2、利用apparent_enco…

远程桌面如何连接?

远程桌面连接是一种可以在不同地点之间共享电脑桌面的技术。通过远程桌面连接&#xff0c;用户可以在远程的计算机上操作另一台计算机&#xff0c;就像是直接坐在前者的前面一样。这种技术可以帮助用户解决在不同地点之间共享数据、协同办公、设备管理等问题。 【天联】的使用场…

【DevOps】linux命令top详解和实例

目录 一、top 命令基本用法 二、top 的输出解读 解释各部分信息 三、交互命令 四、实用示例 1、基本使用 2、按 CPU 使用率排序 3、 按内存使用率排序 4、监控特定用户的进程 5、实时查看特定 PID 的进程 6、调整屏幕刷新间隔 7、显示批处理模式 8、使用配置文件 …

浅谈@Controller注解和其他四大注解的区别

各位大佬光临寒舍&#xff0c;希望各位能赏脸给个三连&#xff0c;谢谢各位大佬了&#xff01;&#xff01;&#xff01; 目录 1.Spring五大注解的使用约定 2.Controller注解的特别之处 3.总结 1.Spring五大注解的使用约定 Spring的五大注解&#xff08;Controller&#x…

14.CAS原理

文章目录 CAS原理1.什么是CAS2.Unsafe类中的CAS方法2.1.获取UnSafe实例2.2.调用UnSafe提供的CAS方法2.3.调用Unsafe提供的偏移量相关2.4.CAS无锁编程2.4.1.使用cas进行无锁安全自增案例 CAS原理 由于JVM的synchronized重量级锁设计操作系统内核态下的互斥锁的使用&#xff0c;其…

二分判定+选插冒排序+归并快速堆希尔+计数排序

二分力扣题 一&#xff1a;搜索二维矩阵 74. 搜索二维矩阵 按照题意&#xff1a;直接利用二维数组转换成一维数组进行求解 方法一&#xff1a;普通等于的二分查找 class Solution { public:bool searchMatrix(vector<vector<int>>& matrix, int target) {t…

io_uring的使用示例及其解释

io_uring的使用示例及其解释 1 io_uring机制1.1 io_uring机制1.2 io_uring系统调用接口功能介绍1.2.1 io_uring_setup()&#xff1a;1.2.2 io_uring_enter()&#xff1a;1.2.3 io_uring_register()&#xff1a; 2 liburing2.1 liburing简介2.2 liburing编译2.2.1 liburing的代码…

基础ArkTS组件:导航栏组件(HarmonyOS学习第三课【3.8】)

Navigation 官方文献 Navigation 组件一般作为页面布局的根容器&#xff0c;它提供了一系列属性方法来设置页面的标题栏、工具栏以及菜单栏的各种展示样式。 Navigation 除了提供了默认的展示样式属性外&#xff0c;它还提供了 CustomBuilder 模式来自定义展示样式 说明 该…

SQLZOO:SELECT from NOBEL Tutorial

数据表&#xff1a;nobel yrsubjectwinner1960ChemistryWillard F. Libby1960LiteratureSaint-John Perse1960MedicineSir Frank Macfarlane Burnet1960MedicinePeter Madawar... Q1 Winners from 1950 Change the query shown so that it displays Nobel prizes for 1950. S…

【Liunx】深入了解 Linux 命令历史:使用 history 命令提高终端效率

这个年纪的我们 爱情跟不上分开的节奏 这个年纪的我们 更珍惜难得的自由 这个年纪的我们 比起从前更容易感动 这个年纪的我们 徘徊在理想与现实之中 不知不觉孤独不再可耻了 不知不觉爸爸的情绪变得脆弱了 不知不觉一把柴米油盐 也成为压力了 不知不觉我们也开始懂事了 …

OCR技术在历史文献数字化中的革命性作用

随着数字化技术的不断发展&#xff0c;历史文献的数字化已成为保存和传播文化遗产的重要途径。其中&#xff0c;光学字符识别&#xff08;OCR&#xff09;技术在历史文献数字化中发挥了革命性的作用&#xff0c;为研究者提供了更广阔的研究空间&#xff0c;推动了历史学研究的发…

kafka安装及收发消息

kafka需要与zookeeper配合使用&#xff0c;但是从2.8版本kafka引入kraft&#xff0c;也就是说在2.8后&#xff0c;zookeeper和kraft都可以管理kafka集群&#xff0c;这里我们依然采用zookeeper来配合kafka。 1、首先我们下载zookeeper 下载地址为 https://zookeeper.apache.org…

智能运维:构建高效统一的运维管理平台

随着信息技术的迅猛发展&#xff0c;企业IT系统的规模和复杂性日益增加&#xff0c;传统的运维模式已难以满足现代企业的需求。为了应对这一挑战&#xff0c;智能运维管理系统应运而生&#xff0c;它通过引入人工智能、大数据、云计算等先进技术&#xff0c;为企业提供高效、智…

三. TensorRT基础入门-剖析ONNX架构并理解ProtoBuf

目录 前言0. 简述1. 执行一下我们的python程序2. ONNX是什么&#xff1f;3. onnx中的各类Proto3.1 理解onnx中的ValueInfoProto3.2 理解onnx中的TensorProto3.3 理解onnx中的NodeProto3.4 理解onnx中的AttributeProto3.5 理解onnx中的GraphProto3.6 理解onnx中的ModelProto 4. …

算法提高之单词接龙

算法提高之单词接龙 核心思想&#xff1a;dfs 预处理每两个字符串之间最短的公共部分长度 求最短公共 最终字符串是最长 dfs所有开头字符串 #include <iostream>#include <cstring>#include <algorithm>using namespace std;const int N 25;int g[N][N…

【js函数name属性】

js函数的name属性 var a{sayName:function(){//函数自带name属性&#xff0c;可以获取函数名&#xff0c;但是不可以获取调用对象console.log(a.sayName.name);}}//函数可以作为对象使用&#xff0c;用.添加属性a.sayName.name2as666;a.sayName.speakfunction(){console.log(a…

Feign 和 OpenFeign 的区别

Feign 和 OpenFeign 都是用来进行服务间调用的客户端库&#xff0c;它们旨在简化HTTP API客户端的编写过程&#xff0c;使得编写对外部服务的接口就像调用本地方法一样简单。尽管它们有相似之处&#xff0c;但也存在一些关键差异&#xff1a; 归属和演进&#xff1a; Feign 最初…