【排序算法总结】

目录

  • 1. 稳点与非稳定排序
  • 2. 冒泡排序
  • 3. 简单选择排序
  • 4. 直接插入排序
  • 5. 快排
  • 6. 堆排
  • 7. 归并

在这里插入图片描述

1. 稳点与非稳定排序

  • 不稳定的:快排、堆排、选择
  • 原地排序:快排也是
  • 非原地排序:归并 和三个线性时间排序:桶排序 ,计数,基数

2. 冒泡排序

  • 时间复杂度 O(n*n)
  • 空间复杂度 O(1)
  • 稳定
public class ReviewToo {//1.冒泡排序 时间复杂度 O(n*n)  空间复杂度 O(1) 稳定public int[] BubbleSort(int[] a) {int temp;//空间复杂度的体现boolean flag;o:for (int i = 1; i < a.length; i++) {flag = false;for (int j = 0; j < a.length - i; j++) {if (a[j] > a[j + 1]) {temp = a[j];a[j] = a[j + 1];a[j + 1] = temp;flag = true;}}if (flag == false) {break o;}}return a;}

3. 简单选择排序

  • 时间复杂度 O(n*n)
  • 空间复杂度 O(1)
  • 不稳定
    //2.简单选择排序 时间复杂度 O(n*n)  空间复杂度 O(1) 不稳定public int[] simpleSelectSort(int[] a) {int temp, min;//空间复杂度的体现for (int i = 0; i < a.length - 1; i++) {min = i;for (int j = i + 1; j < a.length; j++) {if (a[min] > a[j]) {min = j;}}if (min != i) {temp = a[i];a[i] = a[min];a[min] = temp;}}return a;}

4. 直接插入排序

  • 时间复杂度 O(n*n)
  • 空间复杂度 O(1)
  • 稳定
    //3.直接插入排序 时间复杂度 O(n*n)  空间复杂度 O(1)  稳定public int[] straightInsertionSort(int[] a) {//第一个元素是有序表 后面的是无序表 从后往前插for (int i = 1; i < a.length; i++) {int value = a[i];//要插入的元素int index = i - 1;//要插入的位置while (index >= 0 && value < a[index]) {if (value < a[index]) {a[index+1]=a[index];//索引前移继续找插入位置index--;}}//循环结束找到了插入位置a[index+1]=value;}return a;}}

5. 快排

  • 时间复杂度 O(n* log n)
  • 空间复杂度 O(log n)
  • 不稳定
//4.快排;
// 时间复杂度 O(n* log n)  空间复杂度 O(log n)  不稳定
public class FastSort {public static void quikSort(int[] arr, int left, int right) {// 1.快排终止条件(递归出口):只有一个元素或者无元素,不进行快排if (left >= right) {return;}// 2.选取基准元素:我们以数组左边的元素为基准元素int num = arr[left];// 定义首尾指针int start = left;int end = right;// 3.指针移动条件:指针未相交while (start < end) {// 先移动右边的指针(因为选取的是最左边的元素作为基准元素)//每次找出第一个比基准元素小的 end停到那while (start < end && arr[end] >= num) {end--;}// 再移动左边的指针while (start < end && arr[start] <= num) {start++;}// 两指针终止但没相交,交换元素if (start < end) {int temp = arr[start];arr[start] = arr[end];arr[end] = temp;}}// 4.循环结束两指针相交,排序结束,将基准元素放入指针相交位置arr[left] = arr[start];arr[start] = num;// 5.继续递归:分别对基准元素左右两边的元素进行快排 此时基准元素的左边全部小于它本身,右边全部大于它本身//快排左边quikSort(arr, left, start - 1);//快排右边quikSort(arr, start + 1, right);}//主函数public static void main(String[] args) {int[] arr = {34, 1, 5, -2, 0, 35, 36, 38};//初始的left=0;//right=arr.length-1;quikSort(arr, 0, arr.length - 1);for (int value : arr) {System.out.print(value+" ");}}
}

6. 堆排

//5.堆排;
public class Re {public static void heapSort(int[] arr) {int len = arr.length;int[] top = new int[100];for (int i = 0; i < top.length; i++) {top[i] = arr[i];}buildHeap(top);for (int i = len-1; i >=0 ; i--) {swap(arr,0,i);len--;heapify(arr,0,len);}}public static void buildHeap(int[] arr) {int len = arr.length;for (int i = len / 2 - 1; i >= 0; i--) {heapify(arr, i, len);}}public static void heapify(int[] arr, int i, int len) {int left = 2 * i + 1;int right = 2 * i + 2;int min = i;if (left < len && arr[min] > arr[left]) {min = left;}if (right < len && arr[min] > arr[right]) {min = right;}if (min != i) {swap(arr, min, i);heapify(arr, min, len);}}public static void swap(int[] arr, int i, int j) {int temp;temp = arr[i];arr[i] = arr[j];arr[j] = temp;}
}

7. 归并

//6.归并排序;
import java.util.Arrays;
public class MergeSort {//一、拆分部分public static void split(int[] arr,int left,int right,int[] temp){//递归拆分if (left<right){int mid=(left+right)/2;//左递归分解split(arr, left, mid, temp);//右递归分解split(arr, mid+1, right, temp);//合并merge(arr,left,right,mid,temp); //这么理解就像递归就是重复干一件事 你调用执行就可//上面 先左递归合并 再右递归合并}}//二、合并部分/*** @param arr   要进行排序的初始数组* @param left  左序列数组的初始索引* @param right 右序列数组的初始索引* @param mid   左序列和右序列的交接地方 中间索引*/public static void merge(int[] arr, int left, int right, int mid, int[] temp) {int i = left;//初始化i,作为左序列的初始索引int j = mid + 1;//初始化j,作为右序列的初始索引 mid是向下取整得来的int index = 0;//temp数组的当前索引//1.左右两边序列按照规则填充到temp数组 直到有一边处理完毕//循环条件 两边的数据均为处理完while (i <= mid && j <= right) {if (arr[i] <= arr[j]) { //左元素<=右 就把左里面的首位填充到temptemp[index] = arr[i];i++;//i后移index++;//index后移} else {//反之就填充右里面的首位temp[index] = arr[j];j++;index++;}}//当while循环结束 就有其中一边先处理完毕//2.把另一边中剩下的的数据直接依次填充到temp数组//满足哪个就去哪个循环进行填充while (j <= right) {temp[index] = arr[j];index++;j++;}while ((i <= mid)) {temp[index] = arr[i];index++;i++;}//3.temp数组拷贝到arr中//只有最后一次拷贝是把整个temp拷贝到arr数组中 前几次都是拷贝temp中的一部分//因为前几次的合并没有占满temp数组index=0;//temp索引归0;int tempLeft=left;
//        System.out.println("tempLeft="+tempLeft+" "+"right="+right);//第1次合并 tempLeft=0,right=1;//第2次合并 tempLeft=2,right=3;//第3次合并 tempLeft=0,right=3;//第4次合并 tempLeft=4,right=5;//第5次合并 tempLeft=6,right=7;//第6次合并 tempLeft=4,right=7;//第7次合并 tempLeft=0,right=7;//最后一次合并while (tempLeft<=right){arr[tempLeft]=temp[index];tempLeft++;index++;}}public static void main(String[] args) {int[] arr = new int[]{8, 4, 5, 7, 6, 2, 3, 9};int[] temp=new int[arr.length];split(arr,0, arr.length-1,temp);System.out.println(Arrays.toString(arr));}
}

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

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

相关文章

【经验】VSCode连接远程服务器(可以使用git管理、方便查看和编辑Linux源码)

1、查看OpenSSH Windows10通常自带OpenSSH不需要安装。 Windows10下检查是否已经安装OpenSSH的方法: 1)按下快捷键Win + X,选择Windows PoweShell(管理员) 2)输入以下指令: Get-WindowsCapability -Online | ? Name -like ‘OpenSSH*’ 3)如果电脑未安装OpenSSH,…

基于萤火虫算法优化的Elman神经网络数据预测 - 附代码

基于萤火虫算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于萤火虫算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于萤火虫优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#x…

安科瑞新能源汽车车充电桩有序充电——安科瑞 顾烊宇

要&#xff1a;随着当前经济的不断发展&#xff0c;国家的科技也有了飞速的进步&#xff0c;传统的燃油汽车已经不能适应当前社会的发展&#xff0c;不仅对能源造成巨大的消耗&#xff0c;还对环境造成了污染&#xff0c;当前一种新型的交通运输工具正在占领汽车市场。新能源汽…

Python 的图片处理库 PIL 有哪些强大的地方?

PIL&#xff08;Python Imaging Library&#xff09;是一个强大的Python图片处理库&#xff0c;具有以下几个突出的特点&#xff1a; 支持多种图像格式&#xff1a;PIL可以读取和保存多种图片格式&#xff0c;包括常见的JPEG、PNG、GIF以及BMP等格式。 图片操作灵活多样&#…

物理与网络安全

物流环境安全 场地选择考虑抗震、承重、防火、防水、供电、空气调节、电磁防护、雷击及静电 场地因素&#xff1a; 自然灾害&#xff0c;社会因素&#xff08;加油站、化工厂&#xff09;&#xff0c;配套条件&#xff08;消防&#xff0c;交通&#xff0c;电力&#xff0c;…

爬虫实战3-js逆向入门:以黑猫投诉平台为例

目录 引言 逆向过程 步骤一&#xff1a;找到参数对应js代码位置 步骤二&#xff1a;分析参数值的生成逻辑 步骤三&#xff1a;确定函数u的具体内容 步骤四&#xff1a;使用python实现请求参数的生成 投诉信息爬取 引言 下面是一张主流网页加密方法的思维导图&#xff0c…

算法每日一题:统计重复个数 | 字符串

大家好&#xff0c;我是星恒 感觉好难呀呀呀&#xff01;今天是一道困难题目&#xff0c;思路挺简单&#xff0c;但是有些细节点不是很容易想通&#xff0c;建议大家多画图试一试&#xff0c;这样就会好理解许多 题目&#xff1a;leetcode 466定义 str [s, n] 表示 str 由 n 个…

OpenHarmony之消息机制实现

OpenHarmony之消息机制实现 背景 在之前的介绍&#xff08;OpenHarmony之HDF驱动框架&#xff09;中&#xff0c;了解到OpenHarmony的消息机制主要有以下两种&#xff1a; 用户态应用发送消息到驱动。用户态应用接收驱动主动上报事件。 下面我们分别来看看两种机制用户态的…

23 导航栏

效果演示 实现了一个响应式的导航栏&#xff0c;当鼠标悬停在导航栏上的某个选项上时&#xff0c;对应的横条会从左到右地移动&#xff0c;从而实现了导航栏的动态效果。 Code <div class"flex"><ul><li>1</li><li>2</li><l…

Apache、MySQL、PHP编译安装LAMP环境

1. 请简要介绍一下LAMP环境。 LAMP环境是一个在Linux操作系统上搭建的服务器环境组合&#xff0c;由Apache、MySQL、PHP三种软件构成。这种环境是开源的&#xff0c;跨平台的&#xff0c;并且由于各组件经常一起使用&#xff0c;因此具有高度的兼容性。 其中&#xff0c;Apac…

第三部分使用脚手架:vue学习(61-65)

文章目录 61 创建vue脚手架![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/f71d4324be0542209e690ab9e886d199.png)62 分析脚手架结构63 render函数64 修改默认配置65 ref 属性 61 创建vue脚手架 写完vue文件&#xff0c;没有脚手架做翻译&#xff0c;浏览器不认识…

基于引力搜索算法优化的Elman神经网络数据预测 - 附代码

基于引力搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于引力搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于引力搜索优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

计算机网络学习笔记(一)

文章目录 1.1 请介绍七层网络体系结构。2 .请介绍五层网络体系结构。3 .了解网络编程协议吗&#xff1f;客户端发送给服务器的请求&#xff0c;怎么确定具体的协议&#xff1f;4. TCP、HTTP、FTP分别属于哪一层&#xff1f;5. 讲一下TCP/IP协议。6 .说一说你对ARP协议的理解。7…

继承和多态中的常见笔试面试题(一)

1. 下面哪种面向对象的方法可以让你变得富有( B ) A: 继承 B: 封装 C: 多态 D: 抽象 &#xff08;真趣味题&#xff09;a&#xff0c;期望你爸是李刚&#xff0c;但李刚未必有钱&#xff1b;乐观者选c&#xff0c;多态是在面向对象语言中&#xff0c;接口的多种不同的实现方式…

【SpringBoot】分组校验和自定义校验

分组检验 参数校验时&#xff0c;我们希望不同的方法参数校验规则不同&#xff0c;这时就需要分组校验。 public class Category {NotNull(groups Update.class)private Integer id;//主键IDNotEmptyprivate String categoryName;//分类名称// NotEmpty(groups {Add.class,…

基于闪电搜索算法优化的Elman神经网络数据预测 - 附代码

基于闪电搜索算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于闪电搜索算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于闪电搜索优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&…

机器学习实践

1.波士顿房价预测 波士顿房屋的数据于1978年开始统计&#xff0c;共506个数据点&#xff0c;涵盖了波士顿不同郊区房屋的14种特征信息。 在这里&#xff0c;选取房屋价格&#xff08;MEDV&#xff09;、每个房屋的房间数量&#xff08;RM&#xff09;两个变量进行回归&#xff…

解决报错Exception encountered during context initialization

推荐阅读 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;一&#xff09; 智能化校园&#xff1a;深入探讨云端管理系统设计与实现&#xff08;二&#xff09; 文章目录 推荐阅读报错解决 报错 今天在测试一个类时&#xff0c;突然间报了以下错误。 juni…

LeetCode_2_中等_两数相加

文章目录 1. 题目2. 思路及代码实现&#xff08;Python&#xff09;2.1 模拟迭代2.2 递归 1. 题目 给你两个 非空 的链表&#xff0c;表示两个非负的整数。它们每位数字都是按照 逆序 的方式存储的&#xff0c;并且每个节点只能存储 一位 数字。 请你将两个数相加&#xff0c…

自定义异常相关问题及答案(2024)

1、为什么要使用自定义异常&#xff1f; 使用自定义异常&#xff08;Custom Exceptions&#xff09;在程序设计中是一个良好的实践&#xff0c;它有几个重要的好处&#xff1a; 提高代码可读性&#xff1a; 自定义异常的名称如果能清晰表达出异常的情况&#xff0c;那么阅读代…