网络安全JavaSE第六天

7. 数组

7.3.5 数组排序

7.3.5.1 冒泡排序

冒泡排序的思路:相邻两个元素进行比较,如果前面元素比后面元素大就交换位置,每一趟执行完后, 就会得到最大的数。 排序过程分析:

java 复制代码
package com.openlab;
/**
* 冒泡排序
*/
public class BubbleSort {
public static void main(String[] args) {
int[] arr = {6, 9, 1, 5, 2, 3, 8, 4, 7};
print(arr);
// 排序后
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length -1 - i; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
print(arr);
}
private static void print(int[] arr) {
for (int el : arr) {
System.out.print(el + "\t");
}
System.out.println();
}
}

7.3.5.2 选择排序

选择排序的思路:每次都从剩余元素中找到最小的元素并将其放到有序数组的最后。 排序过程:

代码实现:

java 复制代码
package com.openlab;
/**
* 选择排序
*/
public class SelectSort {
public static void main(String[] args) {
int[] arr = {6, 9, 1, 5, 2, 3, 8, 4, 7};
print(arr);
// 排序
for (int i = 0; i < arr.length - 1; i++) {
for (int j = i + 1; j < arr.length; j++) {
if (arr[i] > arr[j]) {
int temp = arr[j];
arr[j] = arr[i];
arr[i] = temp;
}
}
}
print(arr);
}
private static void print(int[] arr) {
for (int el : arr) {
System.out.print(el + "\t");
}
System.out.println();
}
}

7.3.5.3 插入排序

排序思路:默认第一个元素是有序的,然后从后面元素取出元素也前面的元素进行比较,然后找到合适 的位置结束。 排序过程:

排序实现:

7.3.6 数组查找

7.3.6.1 线性查找

思路是将被查找的元素与数组中的每一个元素从前往后一一匹配,如果能匹配上则找到,否则找不到

java 复制代码
public class LineSearch {
public static void main(String[] args) {
int[] arr = {6, 9, 1, 5, 2, 3, 8, 4, 7};
int key = 8; // 要查找的元素
int index = -1;
for (int i = 0; i < arr.length; i++) {
if (arr[i] == key) {
index = i;
break;
}
}
if (index != -1) System.out.println(arr[index]);
else System.out.println("没找到");
}
}

7.3.6.2 折半查找

也叫二分查找,思路是对定义两个指针分别指向被查找数组的第一个元素和最后一个元素的位置,然后 再定义一个中间指针指向第一个指针加上第二个指针然后除以 2 后的位置。如果被查找的元素小于中间 指针对应的元素,则在左边区域查找,如果被查找的元素大于中间指针对应元素则在右边区域查找。 要实现折半查找,被查找的数组必须有序。

java 复制代码
/**
* 折半查找
*/
public class BinarySearch {
public static void main(String[] args) {
int[] arr = {6, 9, 1, 5, 2, 3, 8, 4, 7};
// 排序
for (int i = 0; i < arr.length - 1; i++) {
for (int j = 0; j < arr.length - 1 - i; j++) {
if (arr[j] > arr[j+1]) {
int tmp = arr[j+1];
arr[j+1] = arr[j];
arr[j] = tmp;
}
}
}
int key = 8; // 被查找的元素
int left = 0; // 左指针
int right = arr.length - 1; // 右指针
int middle = (left + right) / 2; // 中间指针
while (arr[middle] != key) {
if (key < arr[middle]) {
right = middle - 1;
}
if (key > arr[middle]) {
left = middle + 1;
}
if (middle > right) {
middle = -1;
break;
}
middle = (left + right) / 2;
}
System.out.println(arr[middle]);
}
}

练习题:

java 复制代码
import java.util.Scanner;
public class Example01 {
public static void main(String[] args) {
String line1 = input(1);
String line2 = input(2);
/*
// 从字符串 line1 中切出元素
String[] line1Arr = line1.split(" ");
String[] line2Arr = line2.split(" ");
//System.out.println(Arrays.toString(line1Arr));
//System.out.println(Arrays.toString(line2Arr));
// 定义要判断的数组
int[] list1 = new int[Integer.parseInt(line1Arr[0])];
int[] list2 = new int[Integer.parseInt(line2Arr[0])];
// 给数组添加元素
for (int i = 1; i < line1Arr.length; i++) {
list1[i-1] = Integer.parseInt(line1Arr[i]);
}
System.out.println("list1 = " + Arrays.toString(list1));
for (int i = 1; i < line2Arr.length; i++) {
list2[i-1] = Integer.parseInt(line2Arr[i]);
}
System.out.println("list2 = " + Arrays.toString(list2));
*/
//int[] list1 = defineArray(line1);
//int[] list2 = defineArray(line2);
// 判断两个数组是否相同
//boolean flag = equals(list1, list2);
boolean flag = equals(defineArray(line1), defineArray(line2));
System.out.println(flag);
}
/**
* 从接收到的字符串中截取需要的数据到数组中并返回
* @param line 需要截取字符串
* @return 返回最终的整型数组
*/
public static int[] defineArray(String line) {
// 判断接收到的字符串是否为空
if (line==null || line.isBlank()) {
System.out.println("你输入的是空。程序退出!");
System.exit(1);
}
// 从字符串 line1 中切出元素
String[] lineArr = line.split(" ");
// 定义要判断的数组
int[] list1 = new int[Integer.parseInt(lineArr[0])];
// 给数组添加元素
for (int i = 1; i < lineArr.length; i++) {
list1[i-1] = Integer.parseInt(lineArr[i]);
}
return list1;
}
/**
* 接收用户输入
* @param n 输入的编号
* @return 返回最终用户输入值
*/
public static String input(int n) {
Scanner sc = new Scanner(System.in);
System.out.println("Enter list"+n+":");
return sc.nextLine();
}
public static boolean equals(int[] list1, int[] list2) {
// 1. 判断两个数组的元素个数是否相同,如果不同则直接返回 false
if (list1.length != list2.length) {
return false;
}
for (int i = 0; i < list1.length; i++) {
if (list1[i] != list2[i]) {
return false;
}
}
return true;
}
}

作业练习:

相关推荐
风筝在晴天搁浅5 分钟前
字节高频题 小于n的最大数
算法
LabVIEW开发7 分钟前
LabVIEW水力机组空蚀在线监测
算法·labview·labview知识·labview功能·labview程序
AI科技星13 分钟前
科幻艺术书本封面:《全域数学》第一部·数术本源 第三卷 代数原本(P95-141)完整五级目录【乖乖数学】
算法·机器学习·数学建模·数据挖掘·量子计算
风筝在晴天搁浅15 分钟前
LeetCode 92.反转链表Ⅱ
算法·leetcode·链表
王老师青少年编程29 分钟前
csp信奥赛C++高频考点专项训练之贪心算法 --【贪心与二分判定】:数列分段 Section II
c++·算法·贪心·csp·信奥赛·二分判定·数列分段 section ii
V搜xhliang02461 小时前
OpenClaw科研全场景用法:从文献到实验室的完整自动化方案
运维·开发语言·人工智能·python·算法·microsoft·自动化
汉克老师1 小时前
GESP2025年3月认证C++五级( 第三部分编程题(2、原根判断))
c++·算法·模运算·gesp5级·gesp五级·原根·分解质因数
数据皮皮侠1 小时前
上市公司创新韧性数据(2000-2024)|顶刊同款 EIR 指数
大数据·人工智能·算法·智慧城市·制造
WL_Aurora1 小时前
Python 算法基础篇之链表
python·算法·链表
科研前沿2 小时前
纯视觉无感解算 + 动态数字孪生:室内外无感定位技术全新升级
大数据·人工智能·算法·重构·空间计算