目录
java八大排序
*冒泡排序
*选择排序
*插入排序
线性查找
二分查找?
数组的动态扩充
练习题
*员工管理系统
员工管理系统2
总结
java八大排序
常用:
冒泡排序
选择排序
插入排序
不常用:
快速排序
希尔排序
堆排序
归并排序
桶排序
int[] arr = new int[]{1,2,-8,35,99};
定义数组的格式
*冒泡排序
public class J冒泡排序 {
public static void main(String[] args) {
// 定义数组
int []arr = new int[]{1,8,5,-10,99};
// 冒泡排序两层循环嵌套
// 外层for循环控制的是需要各个数之间比较几轮
// 内层for循环控制的是每个数真正的比较
// 比较的次数=数组长度-1,因为不能和自己比较
// i、j是下标
for (int i = 0; i < arr.length-1; i++) {
// 因外j+1会越界,所有arr.length会越界,改成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;
}
}
// 因为下标从零开始所有++i好辩认
System.out.println("第"+(i+1)+"轮的比较结果是:");
for (int i1 : arr) {
// 不换行
System.out.print(i1+"、");
}
System.out.println();
}
}
}
(遇小则换位,每一轮确定一个最大值)步骤:
1.定义数组
2.外循环
3.内循环
4.输出数据(设置第三方)
5.打印数据
*选择排序
public class J选择排序 {
public static void main(String[] args) {
// 定义数组
int []arr = new int[] {3,1,5,-8,99,10};
// 外层for循环控制轮
for (int i = 0; i < arr.length; i++) {
// 假设最小数的下标,随着循环每一轮最小值会变
// min和i都递增可以联系 min=i
int min = i;
// 进行比较
// 每回都有变化所以j=i,因为不用和自己比较所有j=i+1
// 虽然j=i+1和length—1效果一样,但是length-1会导致比较的数少一个,所以用j=i+1
for (int j = i+1; j < arr.length; j++) {
// 找到最小值
// >从小到大<从大到小
if(arr[min]>arr[j]){
// 保存最小值的下标
min = j;
}
}
// 换位
int temp = arr[min];
arr[min]=arr[i];
arr[i] =temp;
System.out.print("第"+(i+1)+"次比较结果是:");
for (int i1 : arr) {
System.out.print(i1+"、");
}
System.out.println();
}
for (int i :arr) {
System.out.print(i+"、");
// }
}
}
(遇最小则换位,每一轮确定一个最小值)步骤:
1.定义数组
2.外循环
3.设最小下标
4.内循环
5.保存最小下标
6.换位
*插入排序
public class J插入排序 {
public static void main(String[] args) {
int[] arr = new int[]{1, 2, -8, 35, 99};
// 定义参照物
int current = arr[1];
// length-1防范越界
for (int i = 0; i < arr.length - 1; i++) {
int pre = 0;
if (current > arr[i]) {
current = arr[i + 1];
// 定义上个元素下标
pre = i;
}
// 当上一个数下标是有效的
// 并且保证当前数比上一个数小
// 这是才能向前插入
while (pre >= 0 && current < arr[pre]) ;
{
// 移位:前面的数后移一位
arr[pre + 1] = arr[pre];
pre--;
}
arr[pre + 1] = current;
}
for (int i : arr) {
System.out.println(i + "、");
}
}
}
(第一个数和每个数比较,小则往前插入,直到没有更小结束这一轮)步骤:
1.定义数组 定义参照物
2.外层循环
3.定义上个下标元素
4.进入while循环并移位
有明确值选择个数不多时就用switch
线性查找
import java.util.Scanner;
//输入一个数,若在数组输出下标,若不在输出在目标数组中不存在
//线性查找
public class J线性查找 {
public static void main(String[] args) {
int[] arr = new int[]{1,5,8,25,50};
Scanner sc= new Scanner(System.in);
System.out.println("请输入一数字");
int num =sc.nextInt();
boolean flag=false;
int index = -1;
for (int i=0;i<arr.length;i++){
if(arr[i] == num){
flag= true;
index=i;
break;
}
}
if ((flag)){
System.out.println("你要找的数是\"+num+\"在目标数组中的下标是"+index);
}else {
System.out.println("你要找的数是"+num+"在目标数组中不不存在");
}
}
}
二分查找?
import java.util.Scanner;
//二分法查找
public class J二分法查找 {
public static void main(String[] args) {
int[]arr = new int[]{1,3,5,10};
Scanner sc = new Scanner(System.in);
System.out.println("请输入查找的数字");
int target = sc.nextInt();
// 最左边下标
int left = 0;
// 最右边下标
int right =arr.length-1;
if(target<arr[left]||target>arr[right]){
System.out.println(target+"在目标数组中不存在!");
}else {
// 用来保存下标的值
int res = -1;
while (left<= right){
// 找出中间的下标
int middle = (left+right)/2;
if(arr[middle]==target){
// 中间的数恰巧是我们找的数
res = middle;
break;
}else if (arr[middle]>target){
// 说明我们找的在前半区
right =middle-1;
}else {
left =middle+1;
}
}
System.out.println("");
}
}
}
数组的动态扩充
就这个就是在对数组赋值时,如果数组已经满了以后我们还要对其进行添加数据,那么我们就会对其进行扩充。其实这个案例并不难,我们在对数组进行赋值之前可以判断一下,如果数组已经满了我们就对其进行扩容,随后继续赋值操作。但是怎么判断数组是否已经满了呢?在这里我们可以定义一个int类型的变量num 来存储数组中元素的个数,它的初始值是0,当我们每次赋值以后我们就把它加1,这样我们就有了数组元素的个数。然后我们用数组元素个数num 和数组最大长度arr.length 进行比较,就可以知道数组是否满了。
下面我们就对数组进行扩充,我们先定义一个临时的数组temp ,他的长度是原来数组长度的二倍,随后我们将原数组中数组元素逐个赋值到临时数组中temp ,最后我们再将临时数组赋给原来的数组arr 这就完成了对数组容量的扩充。下面我们来看看具体的代码实现:
import java.util.Arrays;
import java.util.Scanner;
public class Java04 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int[] arr = new int[5];
int i = 0;
while (true) {
if (i == arr.length) {
int[] temp = new int[2 * arr.length];
for (int j = 0; j < arr.length; j++) {
temp[temp.length - 1 - j] = arr[arr.length - j - 1];
}
arr = temp;
}
System.out.println("请输入第"+ (i + 1) +"个数:");
arr[arr.length - 1 - i] = in.nextInt();
i++;
System.out.println("是否继续添加?(1 继续, 其他结束");
int tem = in.nextInt();
if (tem != 1) {
System.out.println(Arrays.toString(arr));
break;
}
}
}
}
练习题
*员工管理系统
import java.util.Objects;
import java.util.Scanner;
public class J715ZY {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String[][] employeeData = new String[2][3];
//int id = 1, name = 1, hobby = 1;
int employeeNum = 0;
top:
while (true) {
System.out.println("欢迎使用员工管理系统:\n* * * * * * * * * ");
System.out.println("* 输入数字请选择功能\t*\n* 1:添加员工\t\t*\n* 2:查询员工\t\t*\n* " +
" 3:修改员工:\t\t*\n* 4:删除员工 \t\t*\n* 0:退出系统 \t\t*\n* *" +
" * * * * * * *");
String flag = in.next();
switch (flag) {
case "1":
while (true) {
if (employeeNum >= employeeData.length) {
String[][] temp = new String[2 * employeeData.length][3];
for (int i = 0; i < employeeData.length; i++) {
for (int j = 0; j < 3; j++) {
temp[i][j] = employeeData[i][j];
}
}
employeeData = temp;
}
employeeData[employeeNum][0] = "Ygh" + (employeeNum + 1);
System.out.println("请输入员工姓名:");
employeeData[employeeNum][1] = in.next();
System.out.println("请输入员工爱好:");
employeeData[employeeNum][2] = in.next();
employeeNum++;
System.out.println("添加成功!\n是否继续添加?(输入 1 继续添加,输入 2 回到主页面,输入其它退出系统!)");
String temp = in.next();
if (temp.equals("1"))
continue;
else if (temp.equals("2"))
continue top;
break top;
}
case "2":
top2:
while (true) {
System.out.println("请选择你要查询的类型序号:\n:1:通过员工号查询\n2:查询全部");
String temp_1 = in.next();
if(temp_1.equals("2")){
for (int i = 0; i < employeeNum; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(employeeData[i][j] + " ");
}
System.out.println();
}
}
else if(temp_1.equals("1")){
System.out.println("请输入你要查询的员工号(Ygh + 序号):");
String id = in.next();
for (int i = 0; i < employeeNum; i++) {
if (id.equals(employeeData[i][0])) {
System.out.println("员工号:" + employeeData[i][0] + "\n员工姓名:" +
employeeData[i][1] + "\n员工爱好:" + employeeData[i][2]);
System.out.println("查询成功!\n是否继续查询?(输入 1 继续查询,输入 2 回到主页面," +
"输入其它退出系统!)");
String temp = in.next();
if (temp.equals("1"))
continue top2;
else if (temp.equals("2"))
continue top;
break top;
}
}
System.out.println("没有此员工号的员工,请重新输入或者按2回到主页面,输入其它退出系统!");
String temp = in.next();
if (temp.equals("2"))
continue top;
break top;
}
else
System.out.println("你输入的有误,请重新输入。");
}
case "3":
top3:
while (true) {
System.out.println("请输入你要修改的员工号(Ygh + 序号):");
String id = in.next();
for (int i = 0; i < employeeNum; i++) {
if (id.equals(employeeData[i][0])) {
System.out.println("员工号:" + employeeData[i][0] + "\n员工姓名:" +
employeeData[i][1] + "\n员工爱好:" + employeeData[i][2]);
System.out.println("请输入你要修改的姓名:");
employeeData[i][1] = in.next();
System.out.println("请输入你要修改的爱好:");
employeeData[i][2] = in.next();
System.out.println("修改成功!\n是否继续修改?(输入 1 继续修改,输入 2 回到主页面," +
"输入其它退出系统!)");
String temp = in.next();
if (temp.equals("1"))
continue top3;
else if (temp.equals("2"))
continue top;
break top;
}
}
System.out.println("没有此员工号的员工,请重新输入或者按2回到主页面,输入其它退出系统!");
String temp = in.next();
if (temp.equals("2"))
continue top;
break top;
}
case "4":/*
*选做
*/
case "0":
break top;
default:
System.out.println("请重新输入。");
}
}
System.out.println("谢谢使用员工管理系统,再见!!!");
}
}
员工管理系统2
import java.util.Scanner;
public class Jhai {
public static void main(String[] args) {
int[] number = new int[2];
String[] name = new String[2];
int count = 0;
top:while (true){
System.out.println("按1进入添加,按2查询,按3修改");
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
switch (a) {
case 1:
// 为了重复添加输入
top1:
while (true) {
if (count == number.length) {
int[] tempNumber = new int[number.length * 2];
String[] tempName = new String[number.length * 2];
for (int i = 0; i < number.length; i++) {
tempNumber[i] = number[i];
tempName[i] = name[i];
}
number = tempNumber;
name = tempName;
}
System.out.println("请输入姓名:");
name[0] = sc.next();
number[0] = count + 1;
System.out.println(number[count]);
count++;
System.out.println("添加成功!是否继续添加?输入1继续,输入2返回主页面");
while (true) {
int temp = sc.nextInt();
if (temp == 1)
// 返回whlie
continue top1;
else if (temp == 2)
continue top;
else
System.out.println("输入错误,请重新输入");
}
}
case 2:
top2:while (true){
System.out.println("请输入你要查询的员工号:");
int temp = sc.nextInt();
int index = -1;
for (int i = 0; i < number.length; i++) {
if(number[i] == temp){
index = i;
break;
}
}
if(index == -1)
System.out.println("没有你输入的员工号");
else
System.out.println("员工号:" + number[index] + ",姓名:" + name[index]);
System.out.println("是否继续查询?输入1继续,输入2返回主页面");
while (true){
int temp2 = sc.nextInt();
if(temp == 1)
// 返回whlie
continue top2;
else if( temp == 2)
continue top;
else
System.out.println("输入错误,请重新输入");
}
}
case 3:
top3:while (true){
System.out.println("请输入你要修改的员工号:");
int temp = sc.nextInt();
int index = -1;
for (int i = 0; i < number.length; i++) {
if(number[i] == temp){
index = i;
break;
}
}
if(index == -1)
System.out.println("没有你输入的员工号");
else{
System.out.println("员工号:" + number[index] + ",姓名:" + name[index]);
System.out.println("请输入你要修改的员工号:");
name[index] = sc.next();
}
System.out.println("是否继续修改?输入1继续,输入2返回主页面");
while (true){
int temp2 = sc.nextInt();
if(temp == 1)
// 返回whlie
continue top3;
else if( temp == 2)
continue top;
else
System.out.println("输入错误,请重新输入");
}
}
}
}
}
}
总结
? ? ? ? 今天学习内容依然繁重,脑瓜依然超负荷使用。
? ? ? ? 三大排序和数组扩容很好的解决了数组的排序等问题。员工管理系统——这算是学习以来最难的、最综合的练习题,在同学的帮助下艰难完成了练习题。
|