首页 > 编程语言 >Java 必会10大的经典算法

Java 必会10大的经典算法

时间:2023-06-30 11:13:11浏览次数:56  
标签:10 Java 元素 堆排序 算法 基数排序 必会 序列 排序

Java 必会10大的经典算法

 

https://github.com/hustcc/JS-Sorting-Algorithm

冒泡排序:思路-两层循环;外层循环控制比较的轮数,内层循环控制每一轮的比较和交换。在每一轮中,通过比较相邻的两个元素,如果前一个元素大于后一个元素,则交换它们的位置。
经过多轮的比较和交换,最大(或最小)的元素会逐渐“冒泡”到数组的末尾
缺点:冒泡排序的效率较低,不适用于大批量数据的排序
快速排序:快速排序又是一种分而治之思想在排序算法上的典型应用
1. 算法步骤

从数列中挑出一个元素,称为 “基准”(pivot);

重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;

递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;

插入排序:它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

算法步骤

将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。

从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)

希尔排序:也称递减增量排序算法,是插入排序的一种更高效的改进版本。但希尔排序是非稳定排序算法
希尔排序的基本思想是:先将整个待排序的记录序列分割成为若干子序列分别进行直接插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行依次直接插入排序。

归并排序:归并排序(Merge sort)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用
1. 算法步骤

申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列;

设定两个指针,最初位置分别为两个已经排序序列的起始位置;

比较两个指针所指向的元素,选择相对小的元素放入到合并空间,并移动指针到下一位置;

重复步骤 3 直到某一指针达到序列尾;

将另一序列剩下的所有元素直接复制到合并序列尾。
堆排序:堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序。分为两种方法:

大顶堆:每个节点的值都大于或等于其子节点的值,在堆排序算法中用于升序排列;

小顶堆:每个节点的值都小于或等于其子节点的值,在堆排序算法中用于降序排列;
计数排序:计数排序的核心在于将输入的数据值转化为键存储在额外开辟的数组空间中。作为一种线性时间复杂度的排序,计数排序要求输入的数据必须是有确定范围的整数
桶排序:桶排序是计数排序的升级版。它利用了函数的映射关系,高效与否的关键就在于这个映射函数的确定。为了使桶排序更加高效,我们需要做到这两点:

在额外空间充足的情况下,尽量增大桶的数量

使用的映射函数能够将输入的 N 个数据均匀的分配到 K 个桶中

同时,对于桶中元素的排序,选择何种比较排序算法对于性能的影响至关重要。

1. 什么时候最快

当输入的数据可以均匀的分配到每一个桶中。

2. 什么时候最慢

当输入的数据被分配到了同一个桶中。
基数排序:基数排序是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
1. 基数排序 vs 计数排序 vs 桶排序

基数排序有两种方法:

这三种排序算法都利用了桶的概念,但对桶的使用方法上有明显差异:

基数排序:根据键值的每位数字来分配桶;

计数排序:每个桶只存储单一键值;

桶排序:每个桶存储一定范围的数值;

 

标签:10,Java,元素,堆排序,算法,基数排序,必会,序列,排序
From: https://www.cnblogs.com/lhl-shubiao/p/17516096.html

相关文章

  • JAVA-去掉小数点后面多余的0
    @TestpublicvoidTestCompare(){//JAVA中Float类型的小数超过4位(前面都是0,例如0.0001)会转成科学计数法存储Floatf=0.0001F;//转BigDecimal的时候避免精度丢失,先转成String类型StringfStr=Float.toString(f);......
  • JavaScript 教程
    JavaScript是Web的编程语言。所有现代的HTML页面都可以使用JavaScript。JavaScript非常容易学。本教程将教你学习从初级到高级JavaScript知识。 为什么学习JavaScript?JavaScript是web开发人员必须学习的3门语言中的一门:HTML 定义了网页的内容CSS 描述......
  • Java数据类型转换,字符串(String)转日期(Date)
    Java类型转换,字符串(String)转日期(Date)importjava.text.ParseException;importjava.text.SimpleDateFormat;importjava.util.Date;publicclassDateTimeConversion{publicstaticvoidmain(String[]args){StringdateString="2011-07-2800:00:00......
  • Java解析json数据(fastjson2)
    Json数据JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。它以易于阅读和编写的方式来表示结构化数据,常用于在不同系统之间进行数据交互和传输。JSON使用键值对的方式来组织数据,具有以下几个特点:具有简洁的语法:JSON使用了人类可读的文本格式,易于理解和编写。支持......
  • Java线程实现方式
    在Java中,可以通过以下几种方式实现线程:继承Thread类:可以创建一个继承自Thread类的子类,并重写run()方法,在run()方法中定义线程的执行逻辑。然后通过创建该子类的实例,并调用start()方法来启动线程。publicclassMyThreadextendsThread{@Overridepublicvoidrun()......
  • Java微服务
    微服务技术服务架构的发展单体架构:将所有的功能都集成在一个项目里面开发,打成一个包部署优点:架构简单,部署成本低缺点:耦合度高分布式架构:根据业务功能对系统进行拆分,将每个业务模块作为独立项目开发,称为一个服务优点:降低服务耦合度,利于服务的升级和扩展微服务是一种经过良好......
  • Java 设计模式实战系列—工厂模式
    在Java开发中,对象的创建是一个常见的场景,如果对象的创建和使用都写在一起,代码的耦合度高,也不利于后期的维护。我们可以使用工厂模式来解决这个问题,工厂模式是一个创建型模式,将对象的创建和使用分离开来,降低代码的耦合度,提高程序的可维护性和扩展性。工厂模式应用场景调用方......
  • 10 线程的状态
    10线程的状态操作系统层面的线程状态初始状态仅是在语言层面创建了线程对象,还未与操作系统线程关联。可运行状态(就绪状态)指该线程已经被创建(与操作系统线程关联),可以由CPU调度执行。阻塞状态如果调用了阻塞API,如BIO读写文件,这时该线程实际不会用到CPU,会导致......
  • C语言学习笔记:1~10章---基本知识
    基本知识2023-06-2923:14:18 1#include<stdio.h>2intmain(void)/*asimpleprogram*/3{4intnum;/*defineavariablecallednum*/5num=1;/*assignavaluetonum......
  • 第10.3篇 html基础标签
    HTML一、HTML简介1.什么是HTMLHTML:HyperTextMarkupLanguage,超文本标记语言。作用:编写网页。2.写一个简单的HTML<html><head><title>pagetitle</title></head><body><fontcolor="red">hello,kitty&......