2022/07/15 学习笔记 (day08)简易算法(排序算法)

34 篇文章 0 订阅
这篇学习笔记详细介绍了冒泡排序、插入排序和选择排序这三种简易排序算法的原理和代码实现。冒泡排序通过重复遍历数列,交换相邻错误顺序的元素直至排序完成;插入排序则是从第一个元素开始,逐步将每个元素插入到正确位置;而选择排序则是在每一趟中直接找到最小(或最大)元素并将其放到已排序序列的末尾。此外,笔记还提出了一个员工管理系统的应用场景,涉及工号生成、信息查询、排序以及数组元素的修改和删除操作。
摘要由CSDN通过智能技术生成

一.简易算法

        排序算法:
         * 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;
						
			
			}
		}
	}
}

 

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值