咦咦咦,各位小可爱,我是你们的好伙伴------bug菌,今天又来给大家普及Java之数组篇啦,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~
🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!
js
环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8
前言
在Java开发中,数组是一种常用的数据结构。数组长度和排序算法是数组相关操作中的重要内容。深入理解数组的长度和掌握常用的排序算法对开发高效的程序非常重要。本文将介绍Java中数组长度和排序算法的相关知识,并提供源代码解析、应用场景案例、优缺点分析、类代码方法介绍、测试用例以及全文小结、总结等内容。
摘要
本文主要介绍Java数组的长度和排序算法。首先,对数组的长度进行解释,并介绍如何获取数组的长度。然后,详细介绍常用的排序算法,包括冒泡排序、选择排序、插入排序、快速排序和归并排序。
概述
数组是一种能够保存多个相同类型数据的容器。在Java中,数组的长度是固定的,一旦数组被创建,其长度就不能再改变。获取数组的长度可以使用数组的length属性。排序算法是一种将数组元素按照特定规则进行排列的算法,常用于对数组进行排序操作。
源代码解析
获取数组长度
在Java中,使用数组的length属性可以获取数组的长度。例如,对于一个整型数组arr,可以使用arr.length获取数组arr的长度。
java
int[] arr = {1, 2, 3, 4, 5};
int length = arr.length;
System.out.println("数组arr的长度为:" + length);
拓展:
给同学们讲解下,这段代码的作用是为了计算数组arr的长度,并将结果输出。
首先,我们创建了一个名为arr的整型数组,并赋值{1, 2, 3, 4, 5}。
接着,我们使用length属性获取数组arr的长度,将结果存储在一个名为length的整型变量中。
最后,我们使用System.out.println()方法输出一个字符串,其中包含了数组arr的长度,即:"数组arr的长度为:" + length。然后,我们在执行这段代码后,输出结果将会是:数组arr的长度为:5,你们也可以实际运行测试一下。
冒泡排序
冒泡排序是一种简单的排序算法,通过依次比较相邻两个元素的大小,不断交换位置,将较大的元素逐渐"冒泡"到数组的末尾。以下是冒泡排序的示例代码:
java
public static void bubbleSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
拓展:
给同学们讲解下,如上代码实现了冒泡排序算法,它用于将给定数组 arr 中的元素按升序排列。其中代码中的外层循环 for (int i = 0; i < n - 1; i++)
控制排序的轮数,对于包含 n 个元素的数组,需要进行 n-1 轮排序。每轮排序都将当前最大的元素移动到末尾。内层循环 for (int j = 0; j < n - i - 1; j++)
是每一轮的比较和交换过程。它从数组的第一个元素开始,比较相邻的两个元素,如果当前元素大于后一个元素,则交换它们的位置。交换操作 int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp;
用一个临时变量 temp 来保存当前元素的值,然后将当前元素的值替换为下一个元素的值,再将下一个元素的值替换为 temp。
通过这样的比较和交换过程,每轮排序都会将当前最大的元素移动到末尾,直到所有元素都被排好序为止。
需要注意的是,冒泡排序算法的时间复杂度为 O(n^2),在处理大规模数据时效率较低。
选择排序
选择排序是一种简单直观的排序算法,每次从未排序部分选择最小的元素放到已排序部分的末尾。以下是选择排序的示例代码:
java
public static void selectionSort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) {
int minIndex = i;
for (int j = i + 1; j < n; j++) {
if (arr[j] < arr[minIndex]) {
minIndex = j;
}
}
int temp = arr[i];
arr[i] = arr[minIndex];
arr[minIndex] = temp;
}
}
拓展:
给同学们讲解下,此代码实现了选择排序算法。对于选择排序是一种简单直观的排序算法,它的基本思想是从待排序的数据元素中选出最小(或最大)的元素,放到序列的起始位置,然后再从剩余未排序的元素中选择出最小(或最大)的元素,放到已排序序列的末尾。重复这个过程,直到整个序列有序。
代码分析如下所示:
- 方法签名:
public static void selectionSort(int[] arr)
,入参为一个整型数组。 - 获取数组长度
n
,表示数组的长度。 - 外层循环
for (int i = 0; i < n - 1; i++)
,控制每一轮选择的起始位置,循环从0到n-1,因为最后一个元素在内循环中会和自身进行比较,没有必要。 - 内层循环
for (int j = i + 1; j < n; j++)
,用于遍历当前选择位置之后的元素,找到最小元素的下标。 - 条件判断
if (arr[j] < arr[minIndex])
,如果找到比当前最小元素更小的元素,则更新最小元素的下标。 - 交换元素
int temp = arr[i]; arr[i] = arr[minIndex]; arr[minIndex] = temp;
,将当前最小元素交换至当前选择位置,确保当前选择位置之前的元素都是有序的。 - 循环结束后,数组中的元素按从小到大的顺序排列。
总结:选择排序算法的时间复杂度为O(n^2),是一种比较简单但效率较低的排序算法。
插入排序
插入排序是一种简单直观的排序算法,类似于整理扑克牌的过程,将未排序的元素依次插入到已排序的部分。以下是插入排序的示例代码:
java
public static void insertionSort(int[] arr) {
int n = arr.length;
for (int i = 1; i < n; i++) {
int key = arr[i];
int j = i - 1;
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
}
拓展:
给同学们讲解下,此代码实现了这是一个插入排序的算法实现。下面是对代码的分析:
-
函数签名:该方法是一个公有的静态方法,接收一个整数数组作为参数,并且不返回任何值。排序后,原始数组会被修改。
-
变量定义:
n
:表示数组的长度,即数组中元素的个数。i
:用于遍历数组元素的索引。key
:临时变量,用于存储当前遍历到的元素的值。j
:用于构建有序序列的索引。
-
外层循环:从数组的第二个元素开始遍历,直到最后一个元素。通过
i
的递增,逐渐将未排序序列中的元素插入到已排序序列中。 -
内层循环:从当前遍历元素的前一个元素开始,向前遍历已排序序列,直到找到合适的位置插入当前的元素。循环条件
arr[j] > key
保证了已排序序列是按升序排列的。 -
元素移动:当内层循环向前遍历时,将大于当前元素的元素向右移动,为当前元素腾出插入位置。通过
arr[j + 1] = arr[j]
将元素移动到空出的位置。 -
插入元素:找到合适的位置后,将当前元素插入到已排序序列中的正确位置,即
arr[j + 1] = key
。 -
排序完成:当外层循环结束时,所有的元素都会被插入到正确的位置,数组就完成了排序。
总体来说,插入排序算法的核心思想是将未排序序列中的元素,逐个插入到已排序序列中的正确位置。时间复杂度为O(n^2),在最坏情况下需要进行n^2/2次比较和n^2/2次交换。插入排序是一种稳定的排序算法,适合处理小规模的数据集或者部分有序的数据。
快速排序
快速排序是一种常用且高效的排序算法,通过选择一个基准元素,将数组分为小于基准元素和大于基准元素的两部分,然后对两部分分别进行快速排序。以下是快速排序的示例代码:
java
public static void quickSort(int[] arr, int low, int high) {
if (low < high) {
int pivot = partition(arr, low, high);
quickSort(arr, low, pivot - 1);
quickSort(arr, pivot + 1, high);
}
}
private static int partition(int[] arr, int low, int high) {
int pivot = arr[low];
while (low < high) {
while (low < high && arr[high] >= pivot) {
high--;
}
arr[low] = arr[high];
while (low < high && arr[low] <= pivot) {
low++;
}
arr[high] = arr[low];
}
arr[low] = pivot;
return low;
}
拓展:
给同学们讲解下,此代码实现了这段代码实现了快速排序算法。快速排序是一种分治算法,它采用递归的方式将数组分成两个子数组,然后对每个子数组进行排序。具体分析如下:
-
快速排序函数
quickSort
接收三个参数:待排序数组arr
,子数组的起始索引low
,子数组的结束索引high
。 -
在
quickSort
函数中,判断low
是否小于high
,如果不满足,则表示子数组中只有一个元素,无需排序,直接返回。 -
在
quickSort
函数中,调用partition
函数来进行分区。partition
函数接收三个参数:待排序数组arr
,子数组的起始索引low
,子数组的结束索引high
。该函数的目的是选取一个基准元素(这里选择了是子数组的第一个元素arr[low]
),并将数组中小于基准元素的部分移到数组的左侧,大于基准元素的部分移到数组的右侧。 -
partition
函数中,定义两个指针low
和high
,并将指针low
的初始值设置为low
,指针high
的初始值设置为high
。同时,将基准元素保存到pivot
变量中。 -
在
partition
函数中,使用 while 循环来交换比基准元素小的元素和比基准元素大的元素的位置。 -
第一个 while 循环用来找到比基准元素小的元素,将指针
high
从数组的右侧向左移动,直到找到一个比基准元素小的元素,或者low
>=high
。 -
如果找到一个比基准元素小的元素,将其赋值给
arr[low]
,并将指针low
从数组的左侧向右移动。 -
第二个 while 循环用来找到比基准元素大的元素,将指针
low
从数组的左侧向右移动,直到找到一个比基准元素大的元素,或者low
>=high
。 -
如果找到一个比基准元素大的元素,将其赋值给
arr[high]
,并将指针high
从数组的右侧向左移动。 -
重复步骤 6~9,直到
low
>=high
。 -
在最后,将基准元素放入合适的位置
arr[low]
,并返回low
。 -
在
quickSort
函数中,根据基准元素的位置pivot
,将数组分成两个子数组,即arr[low...pivot-1]
和arr[pivot+1...high]
,分别对两个子数组递归调用quickSort
函数进行排序。
这样,当 quickSort
函数递归结束后,整个数组就会被排序。
归并排序
归并排序是一种分治策略的排序算法,将数组分为两个子数组,分别进行排序,然后将两个已排序的子数组合并成一个有序数组。以下是归并排序的示例代码:
java
package com.example.javase.bugTest;
/**
* @Author bug菌
* @Date 2024-02-06 19:29
*/
public class Test1 {
public static void mergeSort(int[] arr, int left, int right) {
if (left < right) {
int mid = (left + right) / 2;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
merge(arr, left, mid, right);
}
}
private static void merge(int[] arr, int left, int mid, int right) {
int[] temp = new int[right - left + 1];
int i = left;
int j = mid + 1;
int k = 0;
while (i <= mid && j <= right) {
if (arr[i] <= arr[j]) {
temp[k++] = arr[i++];
} else {
temp[k++] = arr[j++];
}
}
while (i <= mid) {
temp[k++] = arr[i++];
}
while (j <= right) {
temp[k++] = arr[j++];
}
for (int m = 0; m < temp.length; m++) {
arr[left + m] = temp[m];
}
}
}
拓展:
给同学们讲解下,此代码是一个使用归并排序算法对整数数组进行排序的Java代码。
首先我们先定义了一个名为mergeSort
的静态方法,该方法接受三个参数:待排序的数组arr
,数组的左边界left
和数组的右边界right
。该方法采用递归的方式进行排序。
在mergeSort
方法内部,首先检查左边界left
是否小于右边界right
,如果是,则表示需要继续分割数组进行排序。接下来计算中间位置mid
,然后分别对左半部分和右半部分进行递归调用mergeSort
方法。
然后我们调用名为merge
的私有方法,该方法用于将两个有序的子数组合并成一个有序的数组。在merge
方法内部,首先创建一个临时数组temp
,其长度为 右边界right
减去 左边界left
再加1。
接着定义三个指针变量i
、j
和k
,分别指向左半部分的起始位置left
,右半部分的起始位置mid+1
和临时数组temp
的起始位置0。然后比较arr[i]
和arr[j]
的大小,若arr[i]小于等于arr[j],则将arr[i]赋值给temp[k],i和k分别自增1;反之若arr[i]大于arr[j],则将arr[j]赋值给temp[k],j和k分别自增1。重复上述过程直到一个子数组的所有元素都被复制到临时数组。
接下来将剩余未复制的元素依次复制到临时数组。随后将临时数组temp中的元素复制回原数组arr的相应位置。此时,数组arr的左半部分和右半部分分别有序。
最后,运行mergeSort方法可以对给定的数组进行归并排序。注意,在调用该方法前需要传入正确的左边界和右边界,否则结果可能不正确。
测试执行结果如下:
应用场景案例
数组长度和排序算法在各种场景中广泛应用。例如,在对学生成绩进行排序、查找数组中的最大值和最小值、计算数组元素的平均值等方面,数组长度和排序算法能够提供高效的解决方案。
优缺点分析
数组长度和排序算法各自具有一些优点和缺点。数组长度的优点是固定长度,可以直接通过下标访问元素,缺点是长度不可变。排序算法的优点是可以按照不同的需求选择不同的算法,缺点是某些算法的时间复杂度较高。
类代码方法介绍
本文中涉及到的类代码方法主要包括获取数组长度、冒泡排序、选择排序、插入排序、快速排序和归并排序等。具体方法的实现细节已在源代码解析部分进行了说明。
测试用例
为了验证数组长度和排序算法的正确性,可以编写一些测试用例对相应方法进行测试。例如,对给定的数组进行排序,并验证排序结果是否正确。
全文小结
本文主要介绍了Java中数组长度和排序算法的相关内容。从获取数组长度开始,介绍了冒泡排序、选择排序、插入排序、快速排序和归并排序等常用的排序算法。对每个算法进行了源代码解析,并提供了应用场景案例、优缺点分析、类代码方法介绍和测试用例。
总结
通过本文的学习,我们了解了Java中数组长度和排序算法的重要性和应用场景。掌握了获取数组长度的方法,以及冒泡排序、选择排序、插入排序、快速排序和归并排序等常用的排序算法。希望本文能够帮助读者更好地理解和运用数组长度和排序算法。
结尾
感谢您阅读本文!通过学习数组长度和排序算法,相信您对Java开发中的数组操作有了更深入的理解。继续探索和应用这些知识,相信您能开发出更高效的Java程序!
... ...
ok,以上就是我这期的全部内容啦,如果还想学习更多,你可以看看如下的往期热文推荐哦,每天积累一个奇淫小知识,日积月累下去,你一定能成为令人敬仰的大佬。
「赠人玫瑰,手留余香」,咱们下期拜拜~~
附录源码
如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。
☀️建议/推荐你
无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。
最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。
同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。
📣关于我
我是bug菌,CSDN | 掘金 | infoQ | 51CTO 等社区博客专家,历届博客之星Top30,掘金年度人气作者Top40,51CTO年度博主Top12,华为云 | 阿里云| 腾讯云等社区优质创作者,全网粉丝合计15w+ ;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板等海量资料。