数据结构---排序(上)

一.直接插入排序

思想:将一个个未排序的数字插入到已经排好顺序的数组中。

例如:

 思路:先将前两个数字排序,然后将后面数字与前面数字比较排序。

操作:

1.引入变量 i 遍历数组[1,array.lenth]

2.用临时变量tmp记录[i]的值,用于后续比较。

3.与前面数字比较,用 j 遍历[0,i-1]

4.判断[j]与tmp大小,若[j]>tmp则令[j]前移

5.将tmp放在[j+1]

代码:

    public static void insertSort(int[] array) {//遍历整个数组for (int i = 1; i < array.length; i++) {//使0-i有序int j = i-1;int tmp = array[i];for (; j >= 0; j--) {if(tmp < array[j]) {array[j+1] = array[j];}else {//因为前面已经有序,大于之后直接跳出循环break;}}array[j+1] = tmp;}}

时间复杂度:O(n*n)

空间复杂度:O(1)

稳定性:稳定

适用范围:数组越有序,排序越快。

二.希尔排序

思想:将数组分为n组,分别对每组进行排序,然后重复进行分组,排序,最后将数组分成一组进行排序。

 操作:

1.i遍历[gap,array.length-1]

2.记录[i]->tmp

3.j遍历[0,gap-1]  ([i-gap,array.length-1-gap])

4.判断[j]与tmp大小,若[j]>tmp则令[j]前移

5.将tmp放在[j+1]

有没有一点眼熟,对,希尔排序就是对插入排序的优化先让它变成大致有序的数组,在进行插入排序。

时间复杂度:希尔排序的时间复杂度不好计算,因为gap的取值方法很多,导致很难去计算,因此在好些树中给出的希尔排序的时间复杂度都不固定

从书中得知大致范围在O(n^1.25)~O(1.6*n^1.25) 

空间复杂度:O(1)

稳定性:不稳定

    //希尔排序public static void shellSort(int[] array) {int gap = array.length;while(gap != 0) {gap /= 2;shell(array,gap);}}public static void shell(int[] array,int gap) {//遍历整个数组for (int i = gap; i < array.length; i++) {//使0-i有序int j = i-gap;int tmp = array[i];for (; j >= 0; j-=gap) {if(tmp < array[j]) {array[j+gap] = array[j];}else {//因为前面已经有序,大于之后直接跳出循环break;}}array[j+gap] = tmp;}
}

三.选择排序

思想:将最小的元素找到放在左边,然后遍历数组重复这个操作。

操作:

1.   i  遍历数组 

2.记录minIndex最小值的下标,第一次记录为i

3.遍历i之后的元素,每找到比minIndx小的元素就替换minIndex,最终找到最小值

4.交换minIndex与  i  下标元素

    public static void selectSort(int[] array) {for (int i = 0; i < array.length; i++) {int minIndex = i;//找到i之后的 最小的 小于array[i]的元素for (int j = i; j < array.length; j++) {if(array[j] < array[minIndex]) {minIndex = j;}}//将最小的元素换到i下标处swap(array,i,minIndex);}}public static void swap(int[] array,int i,int j) {int tmp = array[i];array[i] = array[j];array[j] = tmp;}
 

时间复杂度:O(N^2)

空间复杂度:O(1)

稳定性:不稳定

选择排序2.0

传统的选择排序使用了一个minIndex,现在介绍使用两个数,minIndex,maxIndex

分别同时寻找最左边与最右边 。

操作:

1.定义left,right用于放置最大值与最小值

2.在left<right时循环,找到所有minIndex,maxIndex

3.定义minIndex,maxIndex,统一定义在left处

4.循环[left+1,right]的元素,并找到minIndex,maxIndex更改下标

5.找到之后swap,注意maxIndex == left 这个特殊情况即可。

    public static void selectSort2(int[] array) {int left = 0;int right = array.length-1;while(left < right) {//两个都初始化在最左边,防止漏掉左边int minIndex = left;int maxIndex = left;//找到中间的最大值与最小值for (int i = left+1; i < right; i++) {if(array[i] < array[minIndex]) {minIndex = i;}if(array[i] > array[maxIndex]) {maxIndex = i;}}swap(array,left,minIndex);//为了防止最大值在left处,然后被交换到minIndex处if(maxIndex == left) {maxIndex = minIndex;}swap(array,right,maxIndex);left++;right--;}}

四.堆排序

排升序要建大堆,排降序建小堆 

思路:建立一个大根堆,转化为小根堆。 

操作:

1.完成向下排序代码:

   1.1找两个孩子节点的最大值(注意只有右节点的情况)

   1.2与父亲节点交换

   1.3令父亲节点上移,并找其孩子节点重复上述过程 

2.创建大根堆:从最后一个父亲节点循环到根节点

3.将根节点与最后一个节点互换,然后继续向下排序重复互换操作。

    //排升序要建大堆,排降序建小堆public static void heapSort(int[] array) {createHeap(array);//换成降序int end = array.length-1;while(end > 0) {swap(array,0,end);//找到最大值放在最后,最终形成降序siftDown(array,0,end);end--;}}//创建大根堆(从下面到上面排序,保证下面先形成  大根堆)public static void createHeap(int[] array) {for(int parent = (array.length-1-1)/2; parent >= 0; parent--) {siftDown(array,parent,array.length);}}//向下排序public static void siftDown(int[] array,int parent,int len) {//孩子节点int child = 2*parent + 1;//将该父亲节点对应的孩子节点  及  孩子的孩子节点  排序while(child < len) {//寻找左右孩子节点Maxif(child + 1 < len && array[child] < array[child+1]) {child++;}if(array[child] > array[parent]) {//上大下小,大根堆swap(array,child,parent);//继续向下排序parent = child;child = 2*parent+1;}else {//下面已经排好了,不满足直接返回break;}}}
 

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

空间复杂度:O(1)

稳定性:不稳定

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

ai翻唱部分步骤

模型部署 我是用的RVC进行的训练&#xff0c;也可以使用so-vits-svc。 通过百度网盘分享的文件&#xff1a;RVC-beta 链接&#xff1a;https://pan.baidu.com/s/1c99jR2fLChoqUFqf9gLUzg 提取码&#xff1a;4090 以Nvida显卡为例&#xff0c;分别下载“RVC1006Nvidia”和…

C++的stack和Queue

1.简单实现stack 构建一个模板&#xff0c;俩个参数&#xff0c;这里第一个一般是数据的类型&#xff0c;第二个是由什么来实现栈&#xff0c;在主函数里传了int和vector<int>&#xff0c;第二个不传参也可以&#xff0c;因为是缺省参数&#xff0c;默认为vector&#x…

默认路由:实现内网所有网段流量走一条默认路由访问外网

默认路由 Tip&#xff1a;默认路由一般指出口网关设备的出口路由。实现所有网段流量都走一条路由。 实验模拟&#xff1a;公司内部pc 通过出口网关 访问运营商内部 baidu服务 isp网关配置&#xff1a; <Huawei>sy Enter system view, return user view with CtrlZ. …

蘑菇书(EasyRL)学习笔记(2)

1、序列决策 1.1、智能体和环境 如下图所示&#xff0c;序列决策过程是智能体与环境之间的交互&#xff0c;智能体通过动作影响环境&#xff0c;环境则返回观测和奖励。智能体的目标是从这些反馈中学习出能最大化长期奖励的策略&#xff0c;这一过程通过不断试错和调整实现强化…

【C语言刷力扣】28.找出字符串中第一个匹配项的下标

题目&#xff1a; 解题思路&#xff1a; 暴力算法 int strStr(char* haystack, char* needle) {int n strlen(haystack), m strlen(needle);for (int i 0; i m < n; i) {bool res true;for (int j 0; j < m; j) {if (haystack[ji] ! needle[j]) {res false;break…

电脑没有下载声卡驱动怎么办?电脑声卡驱动安装方法

在日常使用电脑的过程中&#xff0c;我们可能会遇到电脑没有声音的问题&#xff0c;这往往与声卡驱动缺失或损坏有关。声卡驱动是连接电脑硬件&#xff08;声卡&#xff09;与操作系统之间的桥梁&#xff0c;确保音频信号能够正常输入输出。那么&#xff0c;当电脑没有声卡驱动…

favicon是什么文件?如何制作网站ico图标?

一般我们做网站的话&#xff0c;都会制作一个独特的ico图标&#xff0c;命名为favicon.ico。这个ico图标一般会出现在浏览器网页标题前面。如下图红色箭头所示&#xff1a; 部分博客导航大全也会用到所收录网站的ico图标。比如boke123导航新收录的网站就不再使用网站首页缩略图…

路由策略与路由控制

1. 路由控制概述 2. 路由控制工具 2.1 路由匹配工具 访问控制列表&#xff08;Access Control List, ACL&#xff09;是一个匹配工具。 由若干条 permit / deny 组成的ACL规则组成。 ACL 匹配原则&#xff1a; 一旦命中即停止匹配 ACL在做路由匹配时&#xff0c;更多是匹配…

天生倔强脸的白纸新人,徐畅演艺生涯初舞台获得肯定!

国内首档“微短剧综艺”创新真人秀《开播&#xff01;短剧季》已播出四期&#xff0c;节目集结20余位青年演员竞演角逐&#xff0c;进行经典IP的“二度创作”&#xff0c;最终实现短剧IP孵化。在最新一期正片中&#xff0c;新人演员徐畅凭借一段《离婚律师》的试镜表演&#xf…

Spring Boot解决 406 错误之返回对象缺少Getter/Setter方法引发的问题

目录 前言1. 问题背景2. 问题分析2.1 检查返回对象 3. 解决方案3.1 确保Controller返回Result类型3.2 测试接口响应 4. 原理探讨5. 常见问题排查与优化建议结语 前言 在Spring Boot开发中&#xff0c;接口请求返回数据是系统交互的重要环节&#xff0c;尤其在开发RESTful风格的…

第二十八天|贪心算法|122.买卖股票的最佳时机II,55. 跳跃游戏,45.跳跃游戏II,1005.K次取反后最大化的数组和

目录 122.买卖股票的最佳时机II 方法1&#xff1a;贪心算法&#xff08;简单&#xff09; 方法2&#xff1a;动态规划 55. 跳跃游戏 45.跳跃游戏II 方法1 方法2&#xff08;简洁版&#xff09; 1005.K次取反后最大化的数组和 按照绝对值大小从大到小排序一次 两次排序…

PureMVC在Unity中的使用(含下载链接)

前言 Pure MVC是在基于模型、视图和控制器MVC模式建立的一个轻量级的应用框架&#xff0c;这种开源框架是免费的&#xff0c;它最初是执行的ActionScript 3语言使用的Adobe Flex、Flash和AIR&#xff0c;已经移植到几乎所有主要的发展平台&#xff0c;支持两个版本框架&#xf…

Python CGI编程-cookie的设置、检索

设置检索 其他&#xff1a; 1. http.cookies和http.cookiejar区别&#xff1a; http.cookies主要用于创建和操作单个cookie对象&#xff0c;适用于需要精细控制单个cookie属性的场景。http.cookiejar则用于管理多个cookie&#xff0c;适用于需要自动处理多个请求和响应中的coo…

算法实现 - 快速排序(Quick Sort) - 理解版

文章目录 算法介绍算法分析核心思想三个版本运行过程挖坑法Hoare 原版前后指针法 算法稳定性和复杂度稳定性时间复杂度平均情况O(nlogn)最差情况O( n 2 n^2 n2) 空间复杂度 算法介绍 快速排序是一种高效的排序算法&#xff0c;由英国计算机科学家C. A. R. Hoare在1960年提出&a…

探索Python新境界:Buzhug库的神秘面纱

文章目录 探索Python新境界&#xff1a;Buzhug库的神秘面纱第一部分&#xff1a;背景介绍第二部分&#xff1a;Buzhug库是什么&#xff1f;第三部分&#xff1a;如何安装Buzhug库&#xff1f;第四部分&#xff1a;Buzhug库函数使用方法第五部分&#xff1a;Buzhug库使用场景第六…

Samtec 技术大咖说 | PCB VS 电缆背板?

【摘要/前言】 选择背板设计需要对特定的网络拓扑结构和应用进行权衡。在某些情况下&#xff0c;对PCB与电缆背板的评估不是 "非此即彼"&#xff0c;而是一种组合方式。 Samtec的工程师Andrew Josephson、Brandon Gore和Jonathan Sprigler进行了一次讨论&#xff0c…

一文解析axios源码

写了几年项目&#xff0c;也用了几年的axios&#xff0c;但是一直也不是很了解其中的原理&#xff0c;为啥他能请求前拦截&#xff0c;也为啥他能响应后拦截&#xff0c;正好有空&#xff0c;所以对他的源码进行分析&#xff0c;从github把他的源码拉下来进行分析: 从package.…

Linux权限问题(账号切换,权限,粘滞位)

1.什么是权限&#xff1f; 在Linux下有两种用户&#xff0c;分别是超级用户&#xff08;root&#xff09;和普通用户。超级用户可以在Linux下做任何事情&#xff0c;几乎不受限制&#xff0c;而普通用户一般只能在自己的工作目录下&#xff08;/home/xxx&#xff09;工作&#…

暴雨高频交易服务器,解决金融行业痛点

随着计算机技术、大数据、人工智能和通信技术的飞速发展&#xff0c;金融市场的交易方式迎来了革命性变化。交易决策和执行过程自动化、智能化&#xff0c;极大提高了交易效率和速度&#xff0c;推动了金融行业的整体创新和发展。 在技术的不断进步和全球金融市场的数字化转型…

三、Kafka集群

一、Kafka集群的概念 1、目的 高并发、高可用、动态扩展。 主备数据架构、双活节点、灾备数据中心。 如果是服务的地理范围过大也可以使不同的集群节点服务不同的区域&#xff0c;降低网络延迟。 2、Kafka集群的基本概念 1&#xff09;复制&#xff08;镜像&#xff09; kaf…