简述八大排序(Sort)

1.插入排序

1.1直接插入排序

给定一组数据,若数据只有一个肯定是有序的,我们将无序数据一个个插入到已有序的数据中。用i遍历无序数据,j遍历有序数据,找到合适插入位置,用tmp存放目标插入数据,将其与j对应数据对比,若大于j就放在j后面,小于j就把j数据往前移一位,j–再次判断。具体代码如下:

 public static void insertSort(int [] array){for(int i=1;i<array.length;i++){int tmp=array[i];//无序数据int j=i-1;for(;j>=0;j--){if(array[j]>tmp){array[j+1]=array[j];}else{array[j+1]=tmp;break;}}array[j+1]=tmp;}}

1.2希尔排序

希尔排序可以说时直插排序的plus版本,因为直接插入排序的特性是数据越有序排序越快,所以希尔排序会先把数据分成gap组,gap不固定,将每组中的数据进行排序,gap不断减小,最终当gap等于1时排序完毕。具体代码如下:

 public static void shellSort(int [] array){int gap=array.length;while(gap>1){gap=gap/2;shell111(array,gap);}}private static void shell(int [] array ,int gap){for(int i=gap;i<array.length;i++){int tmp=array[i];int j=i-gap;for(;j>=0;j=j-gap){if(array[j]>tmp){array[j+gap]=array[j];}else {array[j+gap]=tmp;break;}}array[j+gap]=tmp;}}

2.选择排序

2.1直接选择排序

思想:j从第一个开始遍历,每次遍历找到当前最小的值的下标,存入minIndex,然后跟下标为i的交换,随后i++,直到整个数据遍历完毕。具体代码实现:

  public static void selectSort(int [] array){for(int i=0;i<array.length;i++){int minIndex=i;for(int j=i+1;j<array.length;j++){if(array[j]<array[minIndex]){minIndex=j;//更新最小下标值}}swap(array,minIndex,i);}}

2.2堆排序

思想:先把一组数据建成堆(升序就大根堆,降序就小根堆),然后将堆首元素与堆尾元素交换,因为堆首元素一定是max/min值,具体代码如下:

 public static void heapSort(int[] array){createHeap111(array);int end=array.length-1;while(end>0){swap(array,end,0);siftDown111(array,0,end-1);end--;}}private static void createHeap(int [] array){int parent=(array.length-2)/2;for(;parent>=0;parent--){siftDown111(array,parent,array.length-1);}}private static void siftDown(int[] array, int parent,int end) {int child=parent*2+1;while(child<=end){if(child+1<=end&&array[child]<array[child+1]){child++;}if(array[child]>array[parent]){swap(array,parent,child);parent=child;child=2*parent+1;}else{break;}}}

3.交换排序

3.1冒泡排序

比较i趟,每一趟都将找出当前范围的最小值/最大值,让它排到末尾,也就是每一趟都定义一个j,j从0开始遍历,如果j大于j+1就叫唤,然后j++,直到循环结束,这样一趟下来就能将一个最值交换到末尾。具体代码实现:

  public static void bubbleSort(int [] array){for(int i=0;i<array.length-1;i++){for(int j=0;j<array.length-1-i;j++){if(array[j]>array[j+1]){swap(array,j,j+1);}}}}

3.2快速排序(挖坑法)

思路;首先找出一个基准值tmp,通常由left对应值担任,当left值赋给tmp后,left就可以看作一个坑,此时right往前走,直到找到比tmp小的值将这个值“填”到left坑中,此时right也成了一个坑,left开始走,直到找到比tmp大的值将其“填”到right,就这样直到left和right相遇,这时将tmp“填”到相遇这个坑中。具体代码如下:

public static void rapidSort(int [] array){rapid111(array,0,array.length-1);
}
private static void rapid(int [] array,int left,int right){if(left>=right){return;}int mid=getMid111(array,left,right);rapid111(array,0,mid-1);rapid111(array,mid+1,right);
}
private static int  getMid(int [] array,int left,int right){int tmp=array[left];while(left<right){while(left<right&&array[right]>tmp){right--;}array[left]=array[right];while(left<right&&array[left]<tmp){left++;}array[right]=array[left];}array[left]=tmp;return left;
}

4.归并排序

思想:将一大组数据分解成小组数据,然后将小组数据有序,然后将小组数据合并为大组数据。
所以整个过程就分为:分割——合并
先说分割:结束条件——left==right。若不满足,则计算mid,通过mid将该范围分割为两部分,具体代码如下:

private static void mergeNum(int [] array,int left,int right){
if(left==right){
return ;}
int mid=(left+right)/2;
mergeNum(array,left,mid);
mergeNum(array,mid+1,right);
}

再说合并:假设有两组数据,设计变量s1 e1,s2 e2表示两组数据的头和尾,然后创建一个数组,按从小到大将两组数据放在数组中,然后将这个数组元素复制到array数组中对应的位置。具体代码如下:

 private static void merge(int [] array,int left,int mid,int right){int [] num=new int[right-left+1];int k=0;int s1=left;int e1=mid;int s2=mid+1;int e2=right;while(s1<=e1&&s2<=e2){if(array[s1]<=array[s2]){num[k++]=array[s1++];}else{num[k++]=array[s2++];}}//必有一败  将剩余组数据放在数组while(s2<=e2){num[k++]=array[s2++];}while(s1<=e1){num[k++]=array[s1++];}//数组元素有序,还给arrayfor(int i=0;i<num.length;i++){array[i+left]=num[i];}}

5.计数排序

具体代码如下:

 public static void countSort(int [] array){int left=0;int right=array.length-1;int maxVal=array[0];int minVal=array[0];for(int i=1;i<array.length;i++){if(array[i]>maxVal){maxVal=array[i];}if(array[i]<minVal){minVal=array[i];}}int [] number=new int[maxVal-minVal+1];//初始化计数数组for(int i=0;i<array.length;i++){int index=array[i];number[index-minVal]++;}//将计数数组元素打印到原数组中int index=0;for(int i=0;i<number.length;i++){while(number[i]!=0){array[index]=i+ minVal;index++;number[i]--;}}}

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

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

相关文章

xcode 编译运行错误 Sandbox: rsync(29343) deny(1) file-write-create

解决方法 方法一&#xff1a;修改Targets -> Build Settings 中 ENABLE_USER_SCRIPT_SANDBOXING 设置 NO 方法二&#xff1a;项目使用cocoaPods进行三方管理 且 使用了 use_frameworks&#xff0c;把 use_frameworks 注释掉,然后重新自行pod install

linux系统中防火墙的操作

防火墙 开放ssh端口 sudo ufw allow 22/tcp # 允许 SSH 连接 sudo ufw enable开放防火墙端口 sudo ufw allow 80/tcp # HTTP sudo ufw allow 443/tcp # HTTPS&#xff08;如果需要&#xff09; sudo ufw enable查看挡墙防火墙设置 sudo ufw status删除其中一条防火墙规…

[特殊字符] 超强 Web React版 PDF 阅读器!支持分页、缩放、旋转、全屏、懒加载、缩略图!

在现代 Web 项目中&#xff0c;PDF 浏览是一个常见需求&#xff1a;从政务公文到合同协议&#xff0c;PDF 文件无处不在。但很多方案要么体验不佳&#xff0c;要么集成复杂。今天&#xff0c;我给大家带来一个开箱即用、功能全面的 PDF 预览组件 —— [PDFView](https://www.np…

设计模式——策略设计模式(行为型)

摘要 策略设计模式是一种行为型设计模式&#xff0c;它定义了一系列算法并将每个算法封装起来&#xff0c;使它们可以相互替换。该模式让算法的变化独立于使用算法的客户&#xff0c;从而使得算法可以灵活地切换和扩展。其主要角色包括策略接口、具体策略类和环境类。策略模式…

DeepSeek-R1-0528,官方的端午节特别献礼

DeepSeek&#xff1a;端午安康&#xff01;刻在国人骨子里的浪漫 2025 年 05 月 28 日 | DeepSeek 端午特别献礼 当粽叶飘香时&#xff0c;DeepSeek 悄然带来一份节日惊喜 版本号 DeepSeek-R1-0528 正式上线 官方赋予它的灵魂是&#xff1a; 思考更深 推理更强 用户通过官网…

mac安装brew时macos无法信任ruby的解决方法

背景 在使用如下脚本安装brew时&#xff0c;遇到安装ruby&#xff0c;macos不信任外部软件&#xff0c;在安全性点击信任仍然无法安装。 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"如何解决 本地安装好符…

2025音频传输模块全球选购指南:高品质音频体验的品牌之选

随着无线技术的迅猛发展&#xff0c;音频传输模块&#xff08;Audio Transmission Module&#xff09;已成为高品质音频体验的关键技术之一。它们广泛应用于智能家居、无线耳机、会议系统、广播设备以及专业音频领域。面对市场上多样化的产品&#xff0c;如何选择适合自己需求的…

解析楼宇自控系统:分布式结构的核心特点与优势展现

在建筑智能化发展的进程中&#xff0c;楼宇自控系统作为实现建筑高效运行与管理的关键&#xff0c;其系统结构的选择至关重要。传统的集中式楼宇自控系统在面对日益复杂的建筑环境和多样化的管理需求时&#xff0c;逐渐暴露出诸多弊端&#xff0c;如可靠性低、扩展性差、响应速…

Spring Boot对一些技术框架进行了统一版本号管理

这个说法是 正确的。 Spring Boot 对许多常用依赖进行了版本管理&#xff0c;因此在项目中引入这些依赖时&#xff0c;通常不需要指定版本号。 Spring Boot 依赖版本管理 &#x1f6e0;️ spring-boot-starter-parent&#xff1a;当你的项目在 pom.xml (Maven 项目) 中继承自…

关于MySQL的索引

一、索引 1、索引概述 1.1、介绍 索引&#xff08; index &#xff09;是帮助 MySQL 高效获取数据的数据结构 ( 有序 ) 。在数据之外&#xff0c;数据库系统还维护着满足特定查找算法的数据结构&#xff0c;这些数据结构以某种方式引用&#xff08;指向&#xff09;数据&…

微服务常用日志追踪方案:Sleuth + Zipkin + ELK

在微服务架构中&#xff0c;一个用户请求往往需要经过多个服务的协同处理。为了有效追踪请求的完整调用链路&#xff0c;需要一套完整的日志追踪方案。Sleuth Zipkin ELK 组合提供了完整的解决方案 Sleuth&#xff1a;生成和传播追踪IDZipkin&#xff1a;收集、存储和可视化…

R语言基础| 创建数据集

在R语言中&#xff0c;有多种数据类型&#xff0c;用以存储和处理数据。每种数据类型都有其特定的用途和操作函数&#xff0c;使得R语言在处理各种数据分析任务时非常灵活和强大&#xff1a; 向量&#xff08;Vector&#xff09;: 向量是R语言中最基本的数据类型&#xff0c;它…

nssctf第二题[SWPUCTF 2021 新生赛]简简单单的逻辑

这是题目&#xff0c;下载后得到一个python文件,打开 解读代码&#xff1a; for i in range(len(list)):key (list[i]>>4)((list[i] & 0xf)<<4)result str(hex(ord(flag[i])^key))[2:].zfill(2)list[i]>>4&#xff1a;从列表中取数字同时高4位向右位…

mysql(十五)

目录 子查询 1.准备工作 2--创建表格 3--插入数据 2.where 子查询单列单个数据 格式 查询 3.where 子查询单列多个数据(in) 格式 查询 使用子查询 4.from 多行多数据 格式 查询 子查询 将select的查询的返回结果 当成另外一个selet语句的内容去使用。 子查询放在()里面 注意…

【HarmonyOS 5】鸿蒙Taro跨端框架

‌Taro跨端框架‌ 支持React语法开发鸿蒙应用&#xff0c;架构分为三层&#xff1a; ArkVM层运行业务代码和React核心TaroElement树处理节点创建和属性绑定TaroRenderNode虚拟节点树与上屏节点一一对应 import { Component } from tarojs/taro export default class MyCompon…

华为OD机试真题——会议接待 /代表团坐车(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现

2025 A卷 200分 题型 本文涵盖详细的问题分析、解题思路、代码实现、代码详解、测试用例以及综合分析; 并提供Java、python、JavaScript、C++、C语言、GO六种语言的最佳实现方式! 本文收录于专栏:《2025华为OD真题目录+全流程解析/备考攻略/经验分享》 华为OD机试真题《会议…

C语言---动态内存管理、柔性数组

一、malloc和free 1、变长数组 变长数组是指数组的大小可以通过变量来指定。 在c99以及之后的标准中&#xff1a; #include<stdio.h> int main() { int n0; scanf("%d",&n); } 2、malloc和free 这个函数向内存申请一块连续可用的空间&#xff0c;并返…

WEBSTORM前端 —— 第3章:移动 Web —— 第4节:移动适配-VM

目录 一、适配方案 二、VM布局 ​编辑 三、vh布局 四、案例—酷我音乐 一、适配方案 二、VM布局 三、vh布局 四、案例—酷我音乐

Dynamics 365 Business Central AI Sales Order Agent Copilot

#AI Copilot# #D365 BC 26 Wave# 最近很多客户都陆续升级到 Dynamics 365 Business Central 26 wave, Microsoft 提供一个基于Copilot 的Sales Order Agent&#xff0c;此文将此功能做个介绍. Explorer: 可以看到26版本上面增加了这样一个新图标。 Configuration: 配置过程…

【harbor】--配置https

使用自建的 CA 证书来自签署和启用 HTTPS 通信。 &#xff08;1&#xff09;生成 CA认证 使用 OpenSSL 生成一个 2048位的私钥这是 自建 CA&#xff08;证书颁发机构&#xff09; 的私钥&#xff0c;后续会用它来签发证书。 # 1创建CA认证 cd 到harbor [rootlocalhost harbo…