JAVA第三天------排序算法
目录
八大排序法:
1.冒泡排序--见上一篇日记
链接:冒泡排序法
2.快速排序--目前不会
3.插入排序--
动图演示 :
实例:
int [] arr=new int[]{5,6,8,9,7,4,3,1,2};
for (int i = 0; i <arr.length-1; i++) {
current=arr[i+1];//定义上一个元素的下标
int preIndex=i;
//当上一个数的下标有效不能小于0
//并且还要保证当前的数比他上一个数小
//这时候,才能让当前数向前移位
while (preIndex>=0 && current<arr[preIndex]){
arr[preIndex+1]=arr[preIndex];
preIndex--;
}
arr[preIndex+1]=current;
}
4.希尔排序--目前不会
5.选择排序--
动图演示:
实例:
int []arr=new int[]{16,6412,34313,135,343,112,3,512,3,1};
for (int i = 0; i <arr.length-1; i++) {
int min=arr[i];
int minIndex=i;//假设最小的下标
for (int j = i; j <arr.length-1; j++) {
if(arr[minIndex]>arr[j]){//找到了最小值
minIndex=j;
}
}
int temp=arr[minIndex];
arr[minIndex]=arr[i];
arr[i]=temp;
}
6.归并排序--目前不会
7.堆排序---目前不会
8.桶排序---目前不会
查找算法:
普通查找:
注:如果只用for嵌套if查找,如果查找的内容不是第一个,输出结果就会有误
实例
int []arr=new int[]{1,2,3,4,5,6};
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数");
int num=sc.nextInt();
int index=-1;
for (int i = 0; i < arr.length;i++) {
if(arr[i]==num){
index=i;
break;
}
}
if(index!=-1){
System.out.println("你要找的数为:"+arr[index]+",下标为:"+index);
}else{
System.out.println("你要找的数是"+num+",它不存在");
}
二分查找法:
前提:
建立在基础排序上;
原理:
每次查找都会在数组中间的查找;
如果查找的目标元素 > 中间元素,会把中间元素的后一个元素作为左边边界;
如果目标元素 < 中间元素,那么会把中间元素的前一个作为右边边界;
重复上面的操作直到找到或找不到(左边边界索引值 > 右边边界索引值时)为止;
最后中间元素就是你要查找的内容。
int left=0;//最左边的下标
int right=arr.length-1;
if(num<arr[left] || num>arr[right]){
System.out.println(num+"在目标数组中不存在");
}else{
//用来保存找到的下标的值。
int res=-1;
while (left==right){
//找出中间的下标
int middle=(left+right)/2;
if(arr[middle]==num){
res=middle;
//中间的数据恰好就是我们要找的数
left=arr.length;
}else if(arr[middle]>num){
//说明我们要找的数在数组的前半区
/*
如果在前半区
维护left和right
left是不需要动的
right应该移位到中间位置
*/
right=middle-1;
}else{
//条件实际上就是arr[middle]<num
/*
说明在后半区
right是不需要动的
left应该向右移动到中间位置
*/
left=middle+1;
}
}
System.out.println(num+"在目标数组中的下标是"+res);
}
练习题:员工管理系统
注:
1.增加员工时,超过原定数组长度怎么半(数组扩容)
2.查询员工时,查询个体还是查询全部
3.查询个体时,通过工号查询,还是姓名查询
4.修改员工时,一定是先查询数组再进行一系列操作
5.删除员工时,也要先查询数组。
代码示例:
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;
}
}
}
}
心得:
程序的优化是无穷无尽的,只要你想,就可以一直添加功能!
一款优秀的产品一定是一直再优化,更新的!!!