一.简易算法
????????排序算法: ?????????* 1.冒泡排序 ?????????* 2.快速排序 ?????????* 3.插入排序 ?????????* 4.选择排序 ?????????* 5.希尔排序 ?????????* 6.堆排序 ?????????* 7.归并排序 ?????????* 8.桶排序
?1.冒泡排序法:
????????冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
????????原理:每一次排序 ,前后比较 ,元素互换 ,找出最大(最小)值
???????????????????j < arr.length - i - 1 ; j++? ? ? ? ??
?
代码如下:
package homework;
import java.util.Arrays;
public class Test07 {
public static void main(String[] args) {
//排序
//冒泡排序
int[] arr={3,1,6,9,7,2,8,4,5};
int[] arrSort=sort(arr);
//int[] arr={1,2,3,4,5,6,7,8,9};
System.out.println("冒泡排序之后结果是:"+Arrays.toString(arrSort));
}
// 冒泡排序
// int【】 排好序 int[] arr 没排序
public static int[] sort(int[] arr){
int count=0;
for(int i=0;i<arr.length-1;i++){
for(int j=0;j<arr.length-i-1;j++){
//交换判断条件
if(arr[j]>arr[j+1]){
//相隔两数交换位置
int temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
count++;
}
}
System.out.println("循环了多少次"+count+"次");
return arr;
}
}
?优化时,加上boolean变量判断是否有交换,如没有,结束排序操作,提高效率
package homework;
import java.util.Arrays;
// 优化 冒泡排序
public class Test08 {
//冒泡排序的方法
// int[] arr 要排序原数组
// n 表示数组的长度
public static int[] sort(int[] arr,int n){
//如果长度小于1 ,不是数组,跳出方法
boolean flag=false;//提前退出冒泡循环标识位
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;
flag=true;
}
}
if(!flag) break;//没有数据交换提前推出
}
return arr;
}
public static void main(String[] args) {
int[] arr={3,1,6,9,7,2,8,4,5};//9
int[] arrNew=sort(arr,9);
System.out.println("冒泡排充之后"+ Arrays.toString(arrNew));
}
}
?冒泡排序的优点:每进行一趟排序,就会少比较一次,因为每进行一趟排序都会找出一个较大值。
?2.插入排序:
?
?如图所示:从第一个元素开始,该元素可以认为已经被排序,取下一个元素a,从已排序的元素序列从后往前扫描,如果该元素大于a,则将该元素移到下一位,重复该步骤,直到找到已排序元素中小于等于a的元素,a插入到该元素的后面,如果已排序所有元素都大于a,则将a插入到下标为0的位置,然后重复上述步骤。
3.选择排序:
?如图所示:
第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。
以此类推,直到全部待排序的数据元素的个数为零。
????????今日习题:?
????????员工管理系统: ? ? ? ? ? ? ? ? ? ? 员工信息要保存到数组里。 ? ? ? ? ? ? ? ? ? ? 1.工号(不能输入,自动生成的自动递增的一个数字1001) ? ? ? ? ? ? ? ? ? ? 2.员工姓名 ? ? ? ? ? ? ? ? ? ? 员工的工号和姓名都是保存到数组里 ? ? ? ? ? ? ? ? ? ? int [] nos = new int[2]; ? ? ? ? ? ? ? ? ? ? String [] names = new String[2]; ? ? ? ? ? ? ? ? ? ? 要考虑扩容问题 ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? 根据工号查询 ? ? ? ? ? ? ? ? ? ? 如果有能力的同学。可以去做根据姓名查询,姓名可以重名(选做) ? ? ? ? ? ? ? ? ? ? 排序,根据工号从大到小排序
? ? ? ? ? ? ? ? ? ? 修改两个操作: ? ? ? ? ? ? ? ? ? ? 先输入员工号,先查询员工号在不在,如果不在, ? ? ? ? ? ? ? ? ? ? 员工号输入有误, ? ? ? ? ? ? ? ? ? ? 如果在,先显示出原有信息,请输入新的名字, ? ? ? ? ? ? ? ? ? ? 修改信息。 ? ? ? ? ? ? ? ? ? ? 数组删除元素;
方法1:?
package work;
import java.util.Scanner;
public class ManageSystem {
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("请选择你要查询的类型序号:\n1:通过员工号查询\n2:查询全部");
String temp_1 = in.next();
if (temp_1.equals("2")) {
System.out.println("工号 姓名 爱好");
for (int i = 0; i < employeeNum; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(employeeData[i][j] + " ");
}
System.out.println();
}
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;
} 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("没有此员工号的员工,输入 1 重新查询,输入 2 回到主页面,输入其它退出系统!");
String temp = in.next();
if (temp.equals("1"))
continue top2;
else 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("没有此员工号的员工,输入 1 继续修改,输入 2 回到主页面,输入其它退出系统!");
String temp = in.next();
if (temp.equals("2"))
continue top;
else if (temp.equals("1"))
continue top3;
break top;
}
case "4":
top4:
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("确认删除吗(输入”y“或者”y“删除,输入其他返回主页面)?");
String temp_2 = in.next();
if (temp_2.equals("Y") || temp_2.equals("y")) {
while (i <= employeeNum - 1) {
employeeData[i][0] = employeeData[i + 1][0];
employeeData[i][1] = employeeData[i + 1][1];
employeeData[i][2] = employeeData[i + 1][2];
i++;
}
employeeNum--;
} else
continue top;
System.out.println("修改成功!\n是否继续删除?(输入 1 继续删除,输入 2 回到主页面," +
"输入其它退出系统!)");
String temp = in.next();
if (temp.equals("1"))
continue top4;
else if (temp.equals("2"))
continue top;
break top;
}
}
System.out.println("没有此员工号的员工,输入 1 重新输入,输入 2 回到主页面,输入其它退出系统!");
}
case "0":
break top;
default:
System.out.println("你输入的信息错误,请重新输入。");
}
}
System.out.println("谢谢使用员工管理系统,再见!!!");
}
}
方法2:
import java.util.Scanner;
import java.util.Arrays;
public class ManageSystem {
public static void main(String[] args){
System.out.println("欢迎使用员工管理系统!");
Scanner sc = new Scanner(System.in);
int[] nos = new int[2]; //用于存放员工号
String[] names = new String[2]; //用于存放员工姓名
int noCount = 1000; //员工编号
int empSum = 0; //员工人数
boolean isAdd = false; //是否继续添加
while(true) {
System.out.println("请选择功能:1.添加员工 2.查询员工 3.修改员工 4.删除员工");
int flag = sc.nextInt();
switch (flag) {
case 1:
//添加
isAdd = true;
while(isAdd) {
System.out.print("请输入员工姓名:");
String name = sc.next();
//超出扩容,一次扩容2个单位
if(empSum >= nos.length) {
int[] new_nos = new int[nos.length + 2];
String[] new_names = new String[names.length + 2];
for(int i=0; i<nos.length; i++) {
new_nos[i] = nos[i];
new_names[i] = names[i];
}
nos = new_nos;
names = new_names;
}
//赋值并更新
nos[empSum] = ++noCount;
names[empSum++] = name;
System.out.println("你已添加成功!");
System.out.println("是否继续添加?(true/false):");
isAdd = sc.nextBoolean();
}
break;
case 2:
/*
要求根据工号查询
*/
boolean isFindAll = false;
System.out.print("查询所有员工true;查询单个员工false:");
isFindAll = sc.nextBoolean();
if(isFindAll) {
//查询所有员工
if(names[0] == null) {System.out.println("没有任何员工"); break;}
for(int i=0; i<nos.length; i++) {
System.out.println("员工编号:" + nos[i] + "\t员工姓名:" + names[i]);
}
} else {
System.out.print("请输入你想查询的员工工号:");
int empNo = sc.nextInt();
boolean isFound = false;
for (int i=0 ;i<nos.length ; i++) {
if(empNo == nos[i]) {
System.out.println("员工编号:" + nos[i] + "\t员工姓名:" + names[i]);
isFound = true;
break;
}
}
System.out.print(isFound ? "" : "未找到该员工\n");
}
break;
case 3:
//修改
System.out.print("请输入你想修改的员工工号:");
int empNo1 = sc.nextInt();
boolean isFound1 = false;
for (int i=0 ;i<nos.length ; i++) {
if(empNo1 == nos[i]) {
//显示原有信息
System.out.println("员工编号:" + nos[i] + "\t员工姓名:" + names[i]);
isFound1 = true;
System.out.print("请输入新名字:");
String new_name = sc.next();
//更新新名字
names[i] = new_name;
System.out.println("修改成功!修改结果如下");
System.out.println("员工编号:" + nos[i] + "\t员工姓名:" + names[i]);
break;
}
}
System.out.print(isFound1 ? "" : "员工号有误\n");
break;
case 4:
//删除
System.out.print("请输入你想删除的员工工号:");
int empNo2 = sc.nextInt();
boolean isFound2 = false;
for (int i=0 ;i<nos.length ; i++) {
if(empNo2 == nos[i]) {
//显示原有信息
System.out.println("员工编号:" + nos[i] + "\t员工姓名:" + names[i]);
isFound2 = true;
System.out.print("是否确认删除该员工?(true/false):");
boolean isDel = sc.nextBoolean();
if(isDel) {//删除
for(int j=i; j<nos.length; j++){
if(j == nos.length-1) break;
//位移
nos[j] = nos[j+1];
names[j] = names[j+1];
}
//更新员工数量
empSum--;
System.out.println("删除成功!");
} else {
System.out.println("已取消删除操作!");
}
break;
}
System.out.print(isFound2 ? "" : "你要删除的员工并不存在!\n");
}
break;
default:
System.out.println("无效数值,请重新选择");
break;
}
}
}
}
?
|