2022-07-16 第三小组 高佳誉 学习日记
Java基础算法
重点
- 查询。
- 排序。
思维导图
知识点
1.顺序查找
基本思想:从第一个元素开始按照顺序遍历待查序列,直到查找到目标或者查找失败。
特点:对待查序列没有顺序要求(序列中的数可以是有序的也可以是无序的)。
缺点:效率很低(最坏的情况需要遍历整个待查序列)。
点击查看代码
import java.util.Scanner;
public class Ch01 {
public static void main(String[] args) {
// 数据结构
// 数组
// 链表
// 树
// 图
int[] arr = new int[]{1,58,46,33,10,5,5,8};
int[] arr1 = new int[5];
int j = 0;
Scanner sc = new Scanner(System.in);
System.out.println("请输入一个数:");
int num = sc.nextInt();
boolean flag = true;
for (int i = 0;i<arr.length;i++) {
if (arr[i] == num){
arr1[j]=i;
j++;
flag = false;
}
if (i==arr.length-1){
System.out.print("你要找的数是:"+num+", 数组中有"+j+"个 ,在目标数组中的下标分别是:");
for (int k = 0; k < j; k++) {
System.out.print(arr1[k]+" ");
}
}
}
if(flag){
System.out.println("没有这个数");
}
}
}
2.二分法查找
实现思路:
1、前提:有已经排序的数组A(假设已经做好排序)
2、定义左边界L,右边界R,确定搜索范围,循环执行二分查找(3、4两步)
3、获取中间索引 M = Floor((L+R)/2)
4、中间索引的值 A[M]于待搜索的值T进行比较
4.1 A[M] == T 表示找到,返回中间索引
4.2 A[M] > T 中间值右侧的其他元素都大于T,无需比较,中间索引左边去找,M-1设置为右边界,重新查找
4.3 A[M] < T 中间值左侧侧的其他元素都小于于T,无需比较,中间索引右边去找,M+1设置为左边界,重新查找
5 当L>R 时,表示没有找到,应结束循环。
点击查看代码
import java.util.Scanner;
public class Ch02 {
public static void main(String[] args) {
// 二分法查找
// 条件:找数字的前提是这个数组必须有顺序
int [] arr=new int[]{1,2,3,4,5,6,7,8,9,10};
int left =0;
int right =arr.length-1;
System.out.println("请输入需要寻找的数字!");
Scanner scanner = new Scanner(System.in);
int num=scanner.nextInt();
if(num<arr[left]||num>arr[right]){
System.out.println("没有此数!!!");
}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) {
//在前半区
right = middle - 1;
//因为中间数和目标数对比过,不需要再对比 所以可以-1,不减1也可以;
} else {
//在后半区
left = middle + 1;
}
}
System.out.println("目标数:" + num + " 的下标为:" + res);
}
}
}
3. 冒泡排序
思想:
1.比较相邻的两个元素,如果第一个元素大于第二个元素,就交换位置
2.对每一对相邻的元素再做同样的比较,从最开始的一对到结尾的一对完成全部的比较。最后一个元素肯定最大的
3.对剩下的元素重复第二步操作,直到只有一个元素为止
点击查看代码
import java.util.Arrays;
public class Ch04 {
public static void main(String[] args) {
int [] arr=new int[]{6,2,5,3,8,9,1,7,5,4};
int temp = 0;
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1-i; j++) {
if (arr[j]>arr[j+1]){
temp = arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
4.选择排序
原理:随机确定一个标志位(一般为第一个数字)作为最小数,然后向后遍历,找到比标志位更小的数便与标志位互换位置并更新最小数。
步骤:
将数组的第一个数字设置为标志位最小数并记录最小数下标。
向后遍历,发现更小数后将该数与标志位互换位置并更新最小数与最小数下标。
循环完成排序
点击查看代码
public class Ch03 {
public static void main(String[] args) {
int [] arr=new int[]{6,2,5,3,8,9,1,7,5,4};
for (int i = 0; i < arr.length-1; i++) {
int minNum = arr[i];
int minIndex = i;
for (int j = i+1; j < arr.length; j++) {
if(arr[j]<minNum){
minNum = arr[j];
minIndex = j ;
}
}
arr[minIndex] = arr[i];
arr[i] = minNum;
}
for (int i : arr) {
System.out.print(i+" ");
}
}
}
5.插入循环
思想:选取边界之后把后面的元素放到前面的选区对应位置
步骤:
1、从第一个元素开始,该元素可以认为已经被排序。
2、取出下一个元素,在已经排序的元素序列中从后向前扫描。
3、如果该元素(已排序)大于新元素,则将该元素移到下一位置。
4、重复步骤3,直到找到已排序的元素小于或者大于新元素的位置。
5、将新元素插入到该位置。
6、重复步骤2。
点击查看代码
import java.util.Arrays;
public class Ch05 {
public static void main(String[] args) {
int[] arr = {5,3,2,6,4};
System.out.println("排序前的结果为:" + Arrays.toString(arr));
for (int i = 1; i < arr.length; i++) {
int temp = arr[i];
int j ;
for ( j = i; j > 0&&temp<arr[j-1]; j--) {
arr[j] = arr[j-1];
}
arr[j] = temp;
}
System.out.println("排序后的结果为:" + Arrays.toString(arr));
}
}
掌握程度
大部分的知识点都已经掌握,但不是很熟练。自我建议:多写,多写,多写,理解后形成肌肉记忆。
收获
信心,恒心,毅力是最重要的。这是我们必须具备的心理素质。要是学习这门语言开始的时候很有兴趣。遇到苦难就退缩,这样最终会放弃学习java,没有经历风雨怎么见彩虹。编程就是有的时候就是那么这么人。会遇到很多的困惑。但是一旦你弄懂了,或者是你把问题解决了,你会感到很兴奋,编程的快乐就在此了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~