java数组算法例题(冒泡排序,选择排序,找最大值最小值,添加删除元素等)
Posted Ocean:)
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java数组算法例题(冒泡排序,选择排序,找最大值最小值,添加删除元素等)相关的知识,希望对你有一定的参考价值。
文章目录
数组算法例题
1.数组逆序
第一个和最后一个互换,第二个和倒数第二个互换,就相当于把数组想下图一样,进行对折互换,如果数组个数为奇数,则中间保持不变其余元素互换即可
import java.util.Arrays;
class Demo12 {
public static void main (String[] args) {
int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
System.out.println(Arrays.toString(arr));
reverse(arr);
System.out.println(Arrays.toString(arr));
}
/**
* 数组逆序
* @param arr
*/
public static void reverse(int[] arr) {
for (int i = 0; i < arr.length / 2; i++) {
int temp = arr[arr.length - 1 - i];
arr[arr.length - 1 - i] = arr[i];
arr[i] = temp;
}
}
}
数组展示:System.out.println(Arrays.toString(arr));
2.找出数组中最大值所在下标位置
因为是找下标位置所以可以先定义一个值为数组下标,直接使用 数组[下标] 方式进行比较
import java.util.Arrays;
class Demo13 {
public static void main (String[] args) {
int[] array = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
// 输出数组
System.out.println(Arrays.toString(array));
maxIndexOf(array);
}
/**
* 找到数组中最大的数并且输出
* @param arr
*/
public static void maxIndexOf (int[] arr) {
int maxIndex = 0;
// i 可以从1开始,不需要maxIndex和自己再比较一次
for (int i = 1; i < arr.length; i++) {
if (arr[i] > arr[maxIndex]){
maxIndex = i;
}
}
System.out.printf("最大的数为 : %d 下标为 : %d", arr[maxIndex] , maxIndex);
}
}
3.找出数组中指定元素第一次出现的下标位置
分析
- 第一次出现位置
- 如果有多个重复元素
- 有可能不存在指定元素
import java.util.Arrays;
import java.util.Scanner;
class Demo14 {
public static void main (String[] args) {
int num = 0;
int index = 0;
// 定义数组
int[] array = { 4399, 327, 360, 3, 4, 11, 32, 45, 123, 86};
// 输出数组
System.out.println(Arrays.toString(array));
// 获取用户输入数据
num = getInputNum();
// 获取用户输入数据在数组中第一次出现的位置
index = getIndexOfNum(array, num);
// 输出位置索引
printIndexNum(num, index);
}
/**
* 接受用户传来的数据
* @return 返回接受的数据
*/
public static int getInputNum () {
int num = 0;
java.util.Scanner sc = new Scanner(System.in);
System.out.println("请输入您要查询的数据:");
num = sc.nextInt();
return num;
}
/**
* 找出数组中指定元素第一次出现的下标位置
* @param array
* @return 返回下标
*/
public static int getIndexOfNum(int[] array, int num) {
// 如果找不到数据,则默认是-1
int index = -1;
for (int i = 0; i < array.length; i++) {
if (array[i] == num) {
index = i;
break;
}
}
return index;
}
/**
* 输出数据
* @param num 数组中某一项的值
* @param indexNum 索引值
*/
public static void printIndexNum(int num, int indexNum) {
if (indexNum == -1) {
System.out.println(num + "不在数组中");
} else {
System.out.println("数组中" + num + "第一次出现的下标位置 : " + indexNum);
}
}
}
4.在数组中找出指定下标对应的元素
分析:有可能不存在指定的索引
import java.util.Arrays;
import java.util.Scanner;
class Demo15 {
public static void main(String[] args) {
// 下标值
int indexNum = 0;
// 下标对应的数值
int num = 0;
// 定义数组
int[] array = { 4399, 327, 360, 3, 4, 11, 32, 45, 123, 86};
// 输出数组
System.out.println(Arrays.toString(array));
// 接受用户传来的下标值
indexNum = getIndexNum();
// 查询数组中下标值对应的数值
num = findNumInArray(indexNum, array);
// 输出数值
printNum(indexNum, num);
}
/**
* 接受用户传来的下标值
* @param indexNum 用户传来的下标值
* @return 下标值
*/
public static int getIndexNum() {
int indexNum = 0;
Scanner sc = new Scanner(System.in);
System.out.println("请输入想要查询的下标值:");
indexNum = sc.nextInt();
return indexNum;
}
/**
* 查询数组中下标值对应的数值
* @param indexNum 下标值
* @param array 数组
* @return 返回下标值对应的数值
*/
public static int findNumInArray(int indexNum, int[] array) {
int num = 0;
// 判断用户传来的下标值是否正确,是否越界
if (indexNum > 0 && indexNum < array.length) {
num = array[indexNum];
} else {
// 如果越界num值为-1
num = -1;
}
return num;
}
/**
* 输出数值
* @param num
*/
public static void printNum(int indexNum, int num) {
if (num == -1) {
System.out.println(indexNum + "索引越界");
System.exit(0);
} else {
System.out.println("数组中" + indexNum + "位置的元素为 : " + num);
}
}
}
5.找出指定元素在数组中最后一次出现位置
和找出第一个方法差不多
tips:
- 既然是找最后一个数字,可以倒序查找,提高效率
- 判断找不到的情况
package cn.ocean888;
import java.util.Arrays;
import java.util.Scanner;
// 找出指定元素在数组中最后一次出现位置
public class Demo1 {
public static void main(String[] args) {
int num = 0;
int index = 0;
int[] array = { 4399, 327, 360, 3, 4, 11, 32, 45, 123, 86};
System.out.print(Arrays.toString(array));
// 获取用户输入
num = getInputNum();
// 找出指定元素在数组中最后一次出现位置
index = getLastIndexOf(array, num);
// 输出下标
printIndex(index);
}
/**
* 获取用户输入
* @param num 用户输入数字
* @return num
*/
public static int getInputNum() {
int num = 0;
Scanner sc = new Scanner(System.in);
System.out.println("请输入数组中的一个数字:");
num = sc.nextInt();
return num;
}
/**
* 找出指定元素在数组中最后一次出现位置
* @param array
* @param num
*/
public static int getLastIndexOf(int[] array, int num) {
int index = -1;
// 既然是找最后一个数字,可以倒序查找,提高效率
for (int i = array.length - 1; i >= 0 ; i--) {
if (array[i] == num) {
index = i;
break;
}
}
return index;
}
/**
* 输出下标
* @param index
*/
public static void printIndex(int index) {
if (index != -1) {
System.out.println("指定元素在数组中最后一次出现位置为:" + index);
} else {
System.out.println("指定元素没有在数组中出现");
}
}
}
一定要注意,for循环判断 i < array.length 不是小于等于,因为是从0开始
6.找到元素在指定数组中的所有下标位置
要求:
- 不允许在方法内打印展示
- 考虑多个数据情况
- 需要在方法外获取到下标数据信息
- 不允许使用数组作为返回值
思考1:
- 保存查询数据的下标位置一定会用到数组
- 保存下标的数组数据类型是int类型
解决:
另外使用一个数组,作为形式参数,传递首地址,使用此数组存放下标位置,因为是传递的地址,可以直接更改数组内容,并不需要返回数组的值
思考2:
需要考虑保存下标的数组容量
解决:
返回值数组容量和原数组容量一致,这样及时数组内元素值一致且被选中,也可以存储下来
思考3:
返回值,怎么表示,用什么类型数据
new创建一个新的数组,int类型数组中,所有元素初始值都是0,用什么判断元素索引
解决:
返回找到的元素个数,没有则返回0
package cn.ocean888;
import java.util.Arrays;
public class Demo2 {
public static void main(String[] args) {
// 假设用户要查询3在数组中出现的位置
int num = 3;
int count = 0;
int[] array1 = { 4399, 3, 360, 3, 4, 11, 32, 3, 123, 86};
int[] array2 = new int[array1.length];
// 在array1数组查num重复值索引放到array2中
count = allIndexOf(array1, array2, num);
// 打印输出查询3在数组中出现的位置
printArray(array2, count);
// 打印输出整个数组
System.out.println(Arrays.toString(array2));
}
/**
* 从元素组找到元素在指定数组中的所有下标位置,将下标位置依次赋值给array2数组
* 返回值为array2数组长度,即有多少个重复的值
* @param array1 原数组
* @param array2 存储重复值索引的数组
* @return conunt 有多少个重复的值
*/
public static int allIndexOf(int[] array1, int[] array2, int num) {
// count值既是返回时的存储重复值索引的数组array2的长度,也在循环中可以当作array2的索引
int count = 0;
for (int i = 0; i < array1.length; i++) {
if (array1[i] == num) {
array2[count] = i;
count++;
}
}
return count;
}
/**
* 打印array2数组
* @param array2
*/
public static void printArray(int[] array2, int count) {
for (int i = 0; i < count; i++) {
System.out.println(array2[i]);
}
}
}
7.在指定位置插入指定元素
在数组指定位置添加元素,指定位置后面的依次往后移一位,最后一个0就是要被挤掉的,可以从后向前进行循环操作
核心代码
for (int i = array.length - 1; i > index; i--) {
array[i] = array[i-1];
}
array[index] = insert;
全部代码
package cn.ocean888;
import java.util.Arrays;
public class Demo3 {
// 在指定位置插入指定元素
public static void main(String[] args) {
// 先定义数组,最后一个0就是要被挤掉的
int[] array = { 1, 3, 5, 7, 9, 11, 13, 15, 17, 0};
System.out.println(Arrays.toString(array));
// 要加入位置的索引
int index = 6;
// 要加到这个数组里的数字
int insert = 12;
boolean status = false;
status = addElement(array, index, insert);
printResult(status, array);
}
/**
* 在数组指定位置添加元素,后面的依次往后移一位
* @param array 要添加元素的数组
* @param index 添加进数组的位置索引
* @param insert 要添加进入数组对应位置的值
* @return 返回是否添加成功
*/
public static boolean addElement (int[] array, int index, int insert) {
// 判断插入位置是否存在于数组中
if (index < 0 || index >= array.length) {
return false;
} else {
// 要插入元素位置开始往后元素依次向后移一位
for (int i = array.length - 1; i > index; i--) {
array[i] = array[i-1];
}
array[index] = insert;
return true;
}
}
/**
* 输出更新后的数组
* @param status 添加元素是否成功的状态
* @param array 更新后的数组
*/
public static void printResult(boolean status, int[] array) {
if (status) {
System.out.println(Arrays.toString(array));
} else {
System.out.println("Input Parameter Error");
}
}
}
超出数组会溢出
8.删除数组中指定下标的元素
和添加元素基本一致,逻辑变为从删除位置开始之后的元素都往前移一位,直接覆盖掉要删除位置元素
核心代码
for (int i = index; i < array.length - 1; i++) {
array[i] = array[i+1];
}
// 最后一个元素补零
array[array.length - 1] = 0;
return true;
0代表无效元素,占位使用
全部代码
package cn.ocean888;
import java.util.Arrays;
public class Demo3 {
// 删除指定位置元素
public static void main(String[] args) {
// 先定义数组以上是关于java数组算法例题(冒泡排序,选择排序,找最大值最小值,添加删除元素等)的主要内容,如果未能解决你的问题,请参考以下文章