数组的CRUD操作 和 排序 查询算法【重点】
CRUD:
Read 查询:
1. int[] arr = {1, 2, 4, 5, 6, 7, 8, 9, 10};
静态创建数组。请用代码告诉我元素3的下标是多少???
2. 用户输入10个数保存到数组中(函数), 利用函数找出数组中,最大值所在下标(唯一最大
值)以及最大值是什么?
3. 找出数组中的最大值,放到数组中下标为0的元素位置。 (选择排序算法推演)
4. 找出数组中的所有的最大值下标
.
Update 修改
项目中来讲修改!!!
Create 增加
int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 0};
要求:
1. 数组是排序完整的,从小到大排序
2. 0是无效元素!!!
3. 增加数据,不能影响原本的数组从小到大的排列顺序1
添加操作:
情况1:
添加一个 10,放入到原本是11的位置,也就是说在9之后
{1, 3, 5, 7, 9, 10, 11, 13, 15, 17};
10在index = 5 之后的元素整体向右移动 移动了4个数据
情况2:
添加一个9,放入到原本是11的位置
{1, 3, 5, 7, 9, 9, 11, 13, 15, 17};
9在index = 5,之后的元素整体向右移动 移动了4个数据
情况3:
添加一个20,放入到17之后,数组中没有任何元素大于20
{1, 3, 5, 7, 9, 11, 13, 15, 17, 20};
20在index = 9 ,数组不用移动任何元素
添加流程:
1. 确定数据放入的位置
找出数组中第一个比要插入数据大的元素,该元素所在下标就是要放入数据的位置
如果没有任何一个元素大于要插入的数据,那么这个数据放入到数组的末尾
2. 考虑数组的移动问题
移动的方式,是从最后一个元素开始,到目标位置,从后往前挨个向右移动一位
如果该数是放入到数组的末尾,那么不需要移动操作
3. 把要插入的数据,放入到数组中
Delete 删除
int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 19};
要求:
1. 0是无效元素,可以在删除过程中,用于填充空位
2. 删除操作,不能影响原本数据的排列
删除操作:
情况1:
删除 17 index = 8 之后的元素要向左移动 1位
{1, 3, 5, 7, 9, 11, 13, 15, 19, 0};
情况2:
删除 11 index = 5 之后的元素要向左移动 4位
{1, 3, 5, 7, 9, 13, 15, 17, 19, 0};
情况3:
删除19 index = 9 不需要 向左移动
{1, 3, 5, 7, 9, 11, 13, 15, 17, 0};
情况4:
删除 2 没有该数据,无法删除
删除流程:
1. 要找到删除数所在下标
存在该数,不存在该数
2. 删除操作
3. 最后的数据换成0 占位,表示无效数据
class Demo1 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
int index = indexOf(null, 11);
if (index != -1) {
System.out.println("index = " + index);
} else {
System.out.println("Not Found!");
}
int[] array = {1, 3, 5, 7, 9, 2, 4, 6, 8};
int maxIndex = getIndexOfMaxInArray(array);
if (maxIndex != -1) {
System.out.println("Max is " + array[maxIndex] + " at " + maxIndex);
} else {
System.out.println("函数运行GG!");
}
}
/*
找出数组中最大值以及下标
*/
/**
*找出数组中最大值所在下标
*@param arr 要查询最大值所在下标的int类型数组
*@return int 类型,返回最大值所在下标,返回-1,表示函数运行失败
* 失败原因:1. 传入的地址为null, 2. 数组的元素个数为0
*/
public static int getIndexOfMaxInArray(int[] arr) {
//参数合法性判断
if (null == arr || arr.length == 0) {
System.out.println("传入参数不合法!");
return -1; //函数运行失败
}
//假设下标为0的元素是最大值所在下标
int index = 0;
for (int i = 1; i < arr.length; i++) {
if (arr[index] < arr[i]) {
index = i; //找出比index下标大于的元素所在下标,保存到index 中
}
}
return index;
}
/*
在数组array中,找到目标数据find
*/
/**
*在目标int类型数组array中,找出指定的数据find所在下标
*@param array 要进行查询操作的int类型数据
*@param find 要查找的int类型数据
*@return 返回值是int类型,返回大于等于0的数据,表示找到了find
* 所在下标,如果返回-1,表示函数运行失败或者没有找到
* 失败原因:1. 传入的地址为null, 2. 数组的元素个数为0
*/
public static int indexOf(int[] array, int find) {
//参数合法性判断
if (null == array || array.length == 0) {
System.out.println("传入参数不合法!");
return -1; //表示函数运行失败
}
//定义一个变量
int index = -1;
for (int i = 0; i < array.length; i++) {
if (find == array[i]) { //找到了对应元素
index = i; //把下标保存到index
break; //终止循环
}
}
return index;
}
}
import java.util.Scanner;
class Demo2 {
public static void main(String[] args) {
int[] arr = new int[10];
//1 2 3 4 5 6 7 8 9 10
System.out.println("请输入10个数:");
getNumberFromKeyboard(arr);
/*putMaxAtZeroIndex(arr);
putRestOfMaxAtOneIndex(arr);
putRestOfMaxAtTwoIndex(arr);*/
selectSort(arr);
printIntArray(arr);
}
/*
SelectSort 选择排序算法 (五大常用排序算法第三) 5 ~ 6
*/
/**
*选择排序算法
*@param int[] 要进行选择排序的数组
*@return boolean 返回true表示函数运行成功
* 返回false表示函数运行失败
*/
public static boolean selectSort(int[] arr) {
//参数合法性判断
if (null == arr || arr.length == 0) {
System.out.println("Input param is invalid!");
return false;
}
//for i 外层循环控制要进行查询交换的次数
for (int i = 0; i < arr.length - 1; i++) {
int index = i; //假设的最大值位置,同时i值也是目标数据要放入的位置
//找出剩余为排序数据的最大值
for (int j = i + 1; j < arr.length; j++) {
if (arr[index] < arr[j]) {
index = j;
}
}
//2. 判断,交换位置
if (index != i) {
int temp = arr[index];
arr[index] = arr[i];
arr[i] = temp;
}
}
return true;
}
/*
剩余元素中的最大值放到下标为2的位置
*/
/**
*找出当前数组中剩余元素的最大值放到下标为2的位置
*@param int[] 要处理的数组
*@return boolean 返回true表示函数运行成功,
* 返回false表示函数运行失败
* 失败原因: 1. 传入的数据为null,2. 数组的元素个数为0
*/
public static boolean putRestOfMaxAtTwoIndex(int[] arr) {
//参数合法性判断
if (null == arr || arr.length == 0) {
System.out.println("Input param is invalid!");
return false;
}
//1, 从下标为2开始
int index = 2;
for (int i = 3; i < arr.length; i++) {
if (arr[index] < arr[i]) {
index = i;
}
}
//2. 判断交换
if (index != 2) {
int temp = arr[index];
arr[index] = arr[2];
arr[2] = temp;
}
return true;
}
/*
剩余元素中的最大值放到下标为1的位置
*/
/**
*找出当前数组中剩余元素的最大值放到下标为1的位置
*@param int[] 要处理的数组
*@return boolean 返回true表示函数运行成功,
* 返回false表示函数运行失败
* 失败原因: 1. 传入的数据为null,2. 数组的元素个数为0
*/
public static boolean putRestOfMaxAtOneIndex(int[] arr) {
//参数合法性判断
if (null == arr || arr.length == 0) {
System.out.println("Input param is invalid!");
return false;
}
//1. 参照物为下标为1的元素
int index = 1;
for (int i = 2; i < arr.length; i++) {
if (arr[index] < arr[i]) {
index = i;
}
}
//2. 判断交换
if (index != 1) {
int temp = arr[index];
arr[index] = arr[1];
arr[1] = temp;
}
return true;
}
/*
找出数组中的最大值,放到下标为0的位置
*/
/**
*找出int数组arr中的最大值,放到下标为0的位置
*@param int[] 要处理的数组
*@return boolean 返回true表示函数运行成功,
* 返回false表示函数运行失败
* 失败原因: 1. 传入的数据为null,2. 数组的元素个数为0
*/
public static boolean putMaxAtZeroIndex(int[] arr) {
//参数合法性判断
if (null == arr || arr.length == 0) {
System.out.println("Input Param is Invalid!");
return false; //函数运行失败!
}
//1. 找出最大值所在下标
int index = 0;
for (int i = 1; i < arr.length; i++) {
if (arr[index] < arr[i]) {
index = i;
}
}
//2. 判断,交换位置
if (index != 0) {
int temp = arr[index];
arr[index] = arr[0];
arr[0] = temp;
}
return true;
}
public static boolean getNumberFromKeyboard(int[] arr) {
if (null == arr || arr.length ==0) {
return false;
}
Scanner sc = new Scanner(System.in);
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
return true;
}
public static boolean printIntArray(int[] arr) {
if (null == arr || arr.length == 0) {
return false;
}
for (int i = 0; i < arr.length; i++) {
System.out.println("arr[" + i + "] = " + arr[i]);
}
return true;
}
}
class Demo3 {
public static void main(String[] args) {
int[] arr = {1, 3, 5, 7, 9, 1, 3, 5, 7, 1};
int[] indexes = new int[arr.length];
//count是找到的最大值个数
int count = findAllMaxIndexesInArray(arr, indexes);
for (int i = 0; i < count; i++) {
System.out.println("Max is " + arr[indexes[i]] + " at "
+ indexes[i]);
}
}
/*
找出数组中的所有的最大值下标
分析:
函数的返回值只能返回一个,不能是多个。不能用返回值返回
多个最大值的下标。PASS
用另一个数组保存最大值的下标
返回值,返回找到的最大值的个数。
*/
/**
*从数组arr中找出所有的最大值下标,放入到indexes中数组中,返回找到
*最大值个数。
*@param arr int类型数组,查询最大值的数组
*@param indexes 用于保存最大值所在下标
*@return int 返回找到的最大值个数,如果返回-1,表示运行失败
*/
public static int findAllMaxIndexesInArray(int[] arr, int[] indexes) {
//参数合法性判断
if (null == arr || null == indexes || arr.length == 0
|| indexes.length == 0) {
System.out.println("Input param is invalid!");
return -1; //表示函数运行失败
}
//1. 确定最大值是谁?
int max = 0;
for (int i = 0; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i];
}
}
//2. 利用循环找出所有最大值的下标,保存到indexes数组中
int count = 0; //计数,最大值个数
//2. 1在arr数组中循环,找到和max一样的元素,得到下标
for (int i = 0; i < arr.length; i++) {
if (max == arr[i]) { //i就是最大值的下标
//2. 2 把当前的i值放入到indexes数组中
indexes[count] = i;
count++; //count 第一是统计个数,第二是indexes下标位置
}
}
return count;
}
}
/*
添加流程:
1. 确定数据放入的位置
找出数组中第一个比要插入数据大的元素,该元素所在下标就是要放入数据的位置
如果没有任何一个元素大于要插入的数据,那么这个数据放入到数组的末尾
2. 考虑数组的移动问题
移动的方式,是从最后一个元素开始,到目标位置,从后往前挨个向右移动一位
如果该数是放入到数组的末尾,那么不需要移动操作
3. 把要插入的数据,放入到数组中
*/
class Demo4 {
public static void main(String[] args) {
int[] arr = {1, 3, 5, 7, 9, 11, 13, 15, 17, 0};
insertNumberIntoArray(arr, -5);
printIntArray(arr);
}
/**
*arr是一个已经排序完成的数组,从小到大。要将insert数据在不影响数组
*排序的情况下,放入到数组中
*@param arr int类型从小到大排序的数组
*@param insert 要插入的int类型数据
*@return boolean 返回true表示函数运行成功,返回false表示函数运行失败
*/
public static boolean insertNumberIntoArray(int[] arr, int insert) {
//参数合法性判断
if (null == arr || arr.length == 0) {
System.out.println("Input param is invalid!");
return false;
}
//1. 确定数据放入的位置
//1.1 假设在数组中没有比insert 大的数据
int index = arr.length - 1; //数组中最大的下标位置
//1.2 利用循环遍历数组,在数组中找出比insert大的第一个数据
for (int i = 0; i < arr.length; i++) {
if (arr[i] > insert) {
index = i; //插入数据要放入的下标位置
break;
}
}
//2. 考虑数组的移动问题
/*
{1, 3, 5, 7, 9, 11, 13, 15, 17, 0};
放入: 10 index = 5 >>> 4
arr[9] = arr[8]
arr[8] = arr[7]
arr[7] = arr[6]
arr[6] = arr[5]
放入: 2 index = 1 >>> 8
放入: 19 index = 9 >>> 0
移动时是从后往前移动 arr[9] = arr[8] arr[8] = arr[7]
arr[i] = arr[i - 1] or arr[i + 1] = arr[i]
*/
for (int i = arr.length - 1; i > index; i--) {
arr[i] = arr[i - 1];
}
//3. 把要插入的数据,放入到数组中
arr[index] = insert;
return true;
}
public static boolean printIntArray(int[] arr) {
if (null == arr || arr.length == 0) {
return false;
}
for (int i = 0; i < arr.length; i++) {
System.out.println("arr[" + i + "] = " + arr[i]);
}
return true;
}
}
/*
1. 要找到删除数所在下标
存在该数,不存在该数
2. 删除操作
3. 最后的数据换成0 占位,表示无效数据
*/
class Demo5 {
public static void main(String[] args) {
int[] arr = {1, 3, 5 ,7, 9, 11, 13, 15, 17, 19};
deleteNumberInArray(arr, 12);
printIntArray(arr);
}
/**
*删除在已排序数组arr中的delete数据,有可能无法删除
*@param arr int类型已经排序的数组,从小到大排序
*@param delete 要进行删除操作的数
*@return boolean 返回true 表示运行成功,返回false表示运行失败
*/
public static boolean deleteNumberInArray(int[] arr, int delete) {
//参数合法性判断
if (null == arr || arr.length == 0) {
System.out.println("Input param is invalid!");
return false;
}
//1. 要找到删除数所在下标 存在该数,不存在该数
//1.1 假设该数不存在
int index = -1;
//1.2 利用循环,遍历整个数组,找到delete在数组中下标,有可能找不到
for (int i = 0; i < arr.length; i++) {
if (delete == arr[i]) {
index = i;
break;
}
}
//2. 删除操作
if (index != -1) {
//删除操作部分
/*
{1, 3, 5, 7, 9, 11, 13, 15, 17, 19}
删除 1: index = 0 <<< 9
删除 11: index = 5 <<< 4
arr[5] = arr[6]
arr[6] = arr[7]
arr[7] = arr[8]
arr[8] = arr[9]
删除 19: index = 9 <<< 0
arr[i] = arr[i + 1]
*/
for (int i = index; i < arr.length - 1; i++) {
arr[i] = arr[i + 1];
}
//3. 最后的数据换成0 占位,表示无效数据
arr[arr.length - 1] = 0;
} else {
//没有这个数据,无法删除
System.out.println("查无此数据,无法删除!");
}
return true;
}
public static boolean printIntArray(int[] arr) {
if (null == arr || arr.length == 0) {
return false;
}
for (int i = 0; i < arr.length; i++) {
System.out.println("arr[" + i + "] = " + arr[i]);
}
return true;
}
}