2022-7-15 学习日记(7th day)简易算法(排序/查找算法)

JAVA第三天------排序算法

目录

JAVA第三天------排序算法

八大排序法:

        1.冒泡排序--见上一篇日记

        2.快速排序--目前不会

        3.插入排序--

        动图演示  : 

         实例:

        4.希尔排序--目前不会

        5.选择排序--

        动图演示:​编辑

         实例:

        6.归并排序--目前不会

        7.堆排序---目前不会

        8.桶排序---目前不会

查找算法:

        普通查找:

        二分查找法:

练习题:员工管理系统

心得:


八大排序法:

        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;
						
			
			}
		}
	}
}

心得:

程序的优化是无穷无尽的,只要你想,就可以一直添加功能!

一款优秀的产品一定是一直再优化,更新的!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值