8.Java内置排序算法

ops/2024/12/26 1:58:37/

10. Java内置算法>排序算法

算法>排序算法的分类

  1. 如何写一个通用的算法>排序算法
  2. 排序元素比较
  3. 分治算法思想
    在这里插入图片描述

算法>排序算法选择的建议

O(n²)算法>排序算法的选择

1.插入排序性能最好、其次是选择排序,冒泡排序性能最差
2.选择排序不是稳定的算法>排序算法
3.插入排序是最好的选择
4.对于大规模的乱序数组的排序,可以使用希尔排序

O(nlogn)算法>排序算法的选择

1.快排时间复杂度最坏情况下是O(n2),合理选择分区点
2.归并排序在任何情况下的时间复杂度都是O(nlogn)
3.归并排序的空间复杂度是O(n),快排空间复杂度是O(nlogn)
4.但是快排不是稳定的算法>排序算法,归并排序是稳定的算法>排序算法

O(n)算法>排序算法的选择

都是对数据有要求的
1.桶排序:桶与桶之间有序、元素均匀的划分到桶中
2.计数排序:应用在数据范围不大的场景
3.基数排序:排序数据可以分割出独立的“位”而且每一位的数据范围不能太大

O(n²)算法>排序算法对比O(nlogn)算法>排序算法

在这里插入图片描述
在这里插入图片描述

如何写一个通用的算法>排序算法

  1. 不能选择线性时间复杂度的桶排序、计数排序、基数排序
  2. 小规模数据,可以使用O(n2)的插入排序
  3. 大规模数据,可以使用O(nlogn)的算法>排序算法

Java内置的算法>排序算法Arrays.sort(int[] data)

  1. 对于小数据量(小于47)的话使用插入排序
  2. 然后小数据量(大于47而小于286)的话使用递归实现的快速排序
  3. 对于大数据量使用迭代(自底朝上)实现的归并排序

引用类型实现Comparable可比较

  1. 基本类型数据比较:天然支持,< > <= >=
  2. 引用类型数据比较
    a. java.lang.Comparable
java">//实现Comparable接口,重写compareTo方法
@Override
public int compareTo(Person o) {if(this.age<o.age){//说明当前对象比o对象小//实际上只要是返回负数就可以,不一定是-1return -1;}else if(this.age>o.age){//说明当前对象比o对象大//实际上只要是返回正数就可以,不一定是-1return 1;}//说明当前对象和o对象一样大return 0;
}//等同于
@Override
public int compareTo(Person o) {return this.age - o.age;    //升序
}

b.java.util.Comparator

java">Comparator<Person> comparator1 = new Comparator<Person>() {@Overridepublic int compare(Person o1, Person o2) {return o1.getAge()-o2.getAge();}
};
int compare1 = comparator1.compare(p1, p2);
System.out.println(compare1);

引用类型数组排序

java">package com.xiaoyi.line.algo.sort.compare;import com.xiaoyi.line.algo.sort.Sorter;import java.util.Arrays;
import java.util.Comparator;public class ThreeWayQuickSorter<E extends Comparable<E>> extends Sorter {public void sort(E[] data) {if (data == null || data.length <= 1) return;sort(data, 0, data.length - 1);}private void sort(E[] data, int lo, int hi) {if (lo >= hi) return;// 分区E pivot = data[hi];int less = lo;int great = hi;int i = lo;while (i <= great) {if (data[i].compareTo(pivot) < 0) {swap(data, i, less);less++;i++;} else if (data[i].compareTo(pivot) > 0) {swap(data, i, great);great--;} else {i++;}}sort(data, lo, less - 1);sort(data, great +1, hi);}//使用比较器比较public void sort(E[] data, Comparator<E> c) {if (data == null || data.length <= 1) return;sort(data, 0, data.length - 1, c);}private void sort(E[] data, int lo, int hi, Comparator<E> c) {if (lo >= hi) return;// 分区E pivot = data[hi];int less = lo;int great = hi;int i = lo;while (i <= great) {if (c.compare(data[i], pivot) < 0) {swap(data, i, less);less++;i++;} else if (c.compare(data[i], pivot) > 0) {swap(data, i, great);great--;} else {i++;}}sort(data, lo, less - 1, c);sort(data, great +1, hi, c);}public static void main(String[] args) {Person p1 = new Person("douma", 40);Person p2 = new Person("laotang", 30);Person p3 = new Person("douma1", 32);Person p4 = new Person("laotang2", 33);Person[] people = new Person[]{p1, p2, p3, p4};Comparator<Person> comparator = ((o1, o2) -> o2.getAge() - o1.getAge());new ThreeWayQuickSorter().sort(people, comparator);System.out.println(Arrays.toString(people));}
}

Java内置算法>排序算法

在这里插入图片描述

引用类型数组排序强调使用稳定算法>排序算法,因此不能用快排
在这里插入图片描述

java">public class JavaSorter {public static void main(String[] args) {int[] data = new int[]{12,23,36,9,24,42};Arrays.sort(data); // 通用的排序System.out.println(Arrays.toString(data));Person p1 = new Person("douma", 40);Person p2 = new Person("laotang", 30);Person p3 = new Person("douma1", 32);Person p4 = new Person("laotang2", 33);Person[] people = new Person[]{p1, p2, p3, p4};//Arrays.sort(people);Comparator<Person> comparator = ((o1, o2) -> o1.getAge() - o2.getAge());//Arrays.sort(people, comparator);// 小规模数据的话选择插入排序// 大规模数据的话选择归并排序//      (老版本使用的是递归实现的归并,而新版本使用的则不是递归实现的归并)//System.out.println(Arrays.toString(people));ArrayList<Person> list = new ArrayList<>();list.add(p1);list.add(p2);list.add(p3);list.add(p4);//动态数组排序Collections.sort(list, comparator);// 底层:Arrays.sortSystem.out.println(list);}
}

http://www.ppmy.cn/ops/144992.html

相关文章

流量主微信小程序工具类去水印

工具类微信小程序流量主带后台管理&#xff0c;可开通广告&#xff0c;带自有后台管理&#xff0c;不借助第三方接口 介绍 支持抖音&#xff0c;小红书&#xff0c;哔哩哔哩视频水印去除&#xff0c;功能实现不借助第三方平台。可实现微信小程序流量主广告变现功能&#xff0c…

美国加州房价数据分析02

5. 特征工程 5.1重构数据集 承接上文提到的相似度排名&#xff0c;去掉部分无关的特征。 train_set.corr()["median_house_value"].sort_values(ascendingFalse)为了提高模型训练后的鲁棒性&#xff0c;即防止过拟合&#xff0c;不建议删除关联度最低几项特征&#…

Docker日志与监控

一、引言 随着容器技术在生产环境中被广泛应用&#xff0c;Docker容器的日志管理与监控变得尤为重要。在现代应用程序中&#xff0c;容器化的应用通常是由多个容器组成的服务&#xff0c;而容器中的日志与监控则是确保服务健康运行、诊断问题和优化性能的关键。通过日志和监控…

自动化立体仓库堆垛机SRM控制系统货叉控制功能块开发设计

1、堆垛机SRM控制系统硬件组态如下图 货叉控制G120变频器,通信报文111 G120变频器配置调试 2、堆垛机SRM控制系统HMI屏幕页面如下图 运行、起升、货叉相关参数设定 3、堆垛机SRM控制系统中相关变量定义如下图 其中包含货叉控制相关变量:货叉左极限、货叉左居中 货叉右极限…

Strip Map和Wafer Map的一些小科普

一、Strip Map和Wafer Map Strip Map和Wafer Map在半导体行业中都是重要的工具,它们各自有不同的应用和特点: 1. Strip Map: - Strip Map主要应用于半导体后道基板上的每个芯片的良率实时追溯。它从Die Bond贴芯片到Wire Bond、Marking为止的过程中实时处理及管理设备上传…

TipTap编辑器:现代化的富文本编辑解决方案

简介 TipTap是一个基于 ProseMirror 的现代化富文本编辑器框架。它具有模块化、可扩展和响应式的特点&#xff0c;特别适合用于Vue、React等现代前端框架中。 主要特点 1. 模块化设计 import { Editor } from tiptap/core import StarterKit from tiptap/starter-kitconst …

C#Halcon联合编程动态生成显示窗口

UI编辑界面 .exe显示界面 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Halcon…

全视通物联数据中台解决方案助力智慧医院新时代

全国医院物联网大会系列活动暨【行走的课堂】标杆研学 四川站“医院物联网应用创新经验交流会”&#xff0c;近日在成都召开。珠海全视通信息技术有限公司总经理林三朝以《物联网技术助力医院高质量发展》为题做了精彩演讲。林总就物联网技术如何助力医院高质量发展&#xff0c…