首页 > 编程语言 >Java中数组算法的学习

Java中数组算法的学习

时间:2024-08-09 19:16:19浏览次数:11  
标签:sort arr Java Comparator int Arrays 算法 数组 排序

数组的算法


目录

概述

  • 简单排序:冒泡排序、选择排序、插入排序
  • 高级排序:快速排序、归并排序、希尔排序
  • 相关算法知识:划分、递归、二分查找

冒泡排序

原理:

  • 从第一个数据开始,与第二个数据相比较,如果第二个数据小于第一个数据,则交换两个数据的位置。
  • 指针由第一个数据移向第二个数据,第二个数据与第三个数据相比较,如果第三个数据小于第二个数据,则交换两个数据的位置。
  • 依此类推,完成第一轮排序。第一轮排序结束后,最大的元素被移到了最右面。
  • 依照上面的过程进行第二轮排序,将第二大的排在倒数第二的位置。
  • 重复上述过程,没排完一轮,比较次数就减少一次。

编码思路:

需要两层循环,第一层循环表示排序的轮数,第二层循环表示比较的次数

代码

public class BubbleSort {

    public static void bubbleSort(int[] arr) {
        int n = arr.length;
        boolean swapped; // 用于标记某趟排序过程中是否发生了交换
        for (int i = 0; i < n-1; i++) {
            swapped = false;
            for (int j = 0; j < n-i-1; j++) {
                // 比较相邻元素,如果顺序错误就交换它们
                if (arr[j] > arr[j+1]) {
                    // 交换 arr[j] 和 arr[j+1]
                    int temp = arr[j];
                    arr[j] = arr[j+1];
                    arr[j+1] = temp;
                    swapped = true;
                }
            }
            // 如果在某趟排序中没有发生交换,说明数组已经有序,可以提前结束排序
            if (!swapped) break;
        }
    }

    public static void main(String[] args) {
        int[] arr = {64, 34, 25, 12, 22, 11, 90};
        bubbleSort(arr);
        System.out.println("Sorted array");
        printArray(arr);
    }

    // 用于打印数组的辅助函数
    static void printArray(int arr[]) {
        int n = arr.length;
        for (int i=0; i<n; ++i)
            System.out.print(arr[i] + " ");
        System.out.println();
    }
}

选择排序

选择排序是一种简单直观的排序算法,无论什么数据进去都是 O(n²) 的时间复杂度。所以用到它的时候,数据规模越小越好。唯一的好处可能就是不占用额外的内存空间了吧。

算法原理

首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置。

再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。

重复第二步,直到所有元素均排序完毕。

代码

public class SelectionSort implements IArraySort {

    @Override
    public int[] sort(int[] sourceArray) throws Exception {
        int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);

        // 总共要经过 N-1 轮比较
        for (int i = 0; i < arr.length - 1; i++) {
            int min = i;

            // 每轮需要比较的次数 N-i
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[min]) {
                    // 记录目前能找到的最小值元素的下标
                    min = j;
                }
            }

            // 将找到的最小值和i位置所在的值进行交换
            if (i != min) {
                int tmp = arr[i];
                arr[i] = arr[min];
                arr[min] = tmp;
            }

        }
        return arr;
    }
}

排序算法库

Arrays 类
java.util.Arrays 类提供了静态方法来对数组进行排序。它可以对基本数据类型数组以及对象数组进行排序。

  • 对基本数据类型数组排序:使用 Arrays.sort() 方法。这个方法使用双轴快速排序算法(Dual-Pivot Quicksort),对于基本数据类型效率很高。
int[] arr = {5, 3, 2, 8, 1};
Arrays.sort(arr);
  • 对对象数组排序:使用同样的 Arrays.sort() 方法,但它要求对象实现 Comparable 接口或者需要一个 Comparator。对于对象数组,默认使用归并排序(Merge Sort)或者改进的归并排序(Timsort),这取决于元素的数量和元素的类型。
String[] strings = {"banana", "apple", "pear"};
Arrays.sort(strings);

Collections 类
java.util.Collections 类提供了静态方法来对集合进行排序。这些方法可以用于List接口的实现类,如ArrayList、LinkedList等。

对List集合排序:使用 Collections.sort() 方法。这个方法也要求集合元素实现 Comparable 接口或者需要一个 Comparator。内部同样使用归并排序或Timsort算法。

List<String> list = new ArrayList<>(Arrays.asList("banana", "apple", "pear"));
Collections.sort(list);

Comparable 和 Comparator 接口
为了让对象能够被排序,Java 提供了两个接口:Comparable 和 Comparator。

Comparable:如果一个类实现了这个接口,它就可以根据自然顺序进行排序。这个接口的 compareTo(Object o) 方法用于对比当前对象与指定对象的顺序。

public class Person implements Comparable<Person> {
    private String name;
 
    public int compareTo(Person another) {
        return this.name.compareTo(another.name);
    }
}

Comparator:这个接口用于定义不同于自然顺序的排序规则。可以将其实例作为参数传递给排序方法(如Arrays.sort()Collections.sort()),以控制排序逻辑。

Comparator<Person> comparator = new Comparator<Person>() {
    public int compare(Person p1, Person p2) {
        return p1.getName().compareTo(p2.getName());
    }
};

Stream API

Java 8 引入的Stream API也支持排序操作,尤其是在处理集合时。

  • 使用Stream对集合进行排序:可以通过 stream.sorted() 方法进行排序,它允许使用 ComparableComparator
List<Person> people = // ...
List<Person> sortedPeople = people.stream()
                                   .sorted(Comparator.comparing(Person::getName))
                                   .collect(Collectors.toList());

标签:sort,arr,Java,Comparator,int,Arrays,算法,数组,排序
From: https://www.cnblogs.com/BingBing-8888/p/18351373

相关文章

  • 瞎猫碰到死耗子,安卓nt_qq数据库密钥算法
    这个我实际上弄了很久了,一开始更新的时候,发现数据库操作都是在so里,那时候是在libkernel.so里直接hooksqlcipher的密钥函数拿到的密钥,32位字符串,很容易让人联想到md5,但是没有找到在哪里计算的最近又想着做一下,这时打开数据库的so就变了,这是easyFrida的sofileopen插件hook出来的......
  • Java基础——注解1——注解的定义与使用
    ......
  • 什么是PID/PID算法
    什么是PID?一、PID的基本概念PID控制算法通过计算误差(即系统输出与期望值之间的差值),并基于该误差进行比例、积分和微分运算,来调整系统的控制输入,以实现快速、准确的控制。PID控制因其结构简单、稳定性好、工作可靠、调整方便等特点,成为工业控制中的主要技术之一。详情了解视频pi......
  • react函数组件实现调用摄像头拍摄功能
    importReact,{useEffect,useRef,useState}from'react'exportdefaultfunctionPaiZhao(){  constcameraVideoRef=useRef(null);  constcameraCanvasRef=useRef(null);  const[Img,setImg]=useState("")  useEffect((......
  • java6
    我学习了常见API知识java.lang.Math提供数学常量和方法,如基本的数学运算(加、减、乘、除)、三角函数、对数、幂运算等。常用方法:Math.abs(x):返回x的绝对值。Math.max(a,b):返回a和b中的较大值。Math.min(a,b):返回a和b中的较小值。Math.sqrt(x):返回x的平方根。Math.pow(a,b......
  • 等级+时间的优先级算法
    简介本算法为等级与时间结合计算对应优先级逻辑等级越高者优先级越高同等级下,时间越小者优先级越高实现主方法calculatePriorityimportcom.zk.blog.enums.TypeEnum;importorg.apache.commons.lang3.StringUtils;/***@program:*@description:*@author:zk......
  • Day24 第七章 回溯算法part03
    目录任务78.子集思路90.子集II思路93.复原IP地址思路心得体会任务78.子集给你一个整数数组nums,数组中的元素互不相同。返回该数组所有可能的子集(幂集)。解集不能包含重复的子集。你可以按任意顺序返回解集。思路和组合问题类似,思路是从序列中每次选一个,选的深度......
  • Android开发基础07-掌握Java语言
    Android开发广泛使用Java作为编程语言,熟练掌握Java语言是十分必要的。1.基础入门知识a.设置开发环境安装JDK(JavaDevelopmentKit):JDK是进行Java开发的必备工具,务必下载安装并配置相应的环境变量。安装IDE(IntegratedDevelopmentEnvironment):推荐使用IntelliJIDEA、E......
  • 今日Java练习:选择题挑战
    题目选自牛客网1.假设num已经被创建为一个ArrayList对象,并且最初包含以下整数值:[0,0,4,2,5,0,3,0]。执行下面的方法numQuest(),数组num会变成?privateList<Integer>nums;//precondition:nums.size()>0//numscontainsIntegerobjectspublicvoidnumQuest(){int......
  • Java中的8种基本数据类型及其存储方式
    文章目录基本数据类型存储方式整型数据浮点型数据char类型数据布尔类型数据其他数据类型的转换自动转换强制转换基本数据类型Java属于C类语言,有8种数据类型数据类型byteshortintlongfloatdoublecharboolean数据大小8bit16bit32bit64bit32bit64bit8bit/24bit/32bit......