学号20182317 2019-2020-1 《数据结构与面向对象程序设计》第八周学习总结
教材学习内容总结
三种常用的查找算法(顺序查查找,折半查找,二叉排序树查找)
1. 顺序查找
对于数组,按顺序比较给定的值,时间复杂度0(n),,以下是实现:
public static int Linear_Search(int[] data, int key) {
if (data == null || data.length <= 0) {
return -1;
}
for (int i = 0; i < data.length; i++) {
if (data[i] == key) {
return i;
}
}
return -1;
}
二分查找
二分查找是针对已有序的序列进行的高效查找,时间复杂度0(n),,以下是实现:
public static int binarySearch(int[] data, int key) {
if (data == null || data.length <= 0) {
return -1;
}
int low = 0;
int high = data.length - 1;
while (low < high) {
int mid = (low + high) / 2;
if (data[mid] == key) {
return mid;
} else if (data[mid] > key) {
high = mid - 1;
} else if (data[mid] < key) {
low = mid + 1;
}
}
return -1;
}
/**
* 二分查找的前提是有序,递归
*
* @param data
* @param key
* @return
*/
public static int recursiveBinarySearch(int[] data, int low, int high, int key) {
if (data == null || data.length <= 0) {
return -1;
}
if (low < high) {
int mid = (low + high) / 2;
if (data[mid] == key) {
return mid;
} else if (data[mid] > key) {
recursiveBinarySearch(data, low, mid - 1, key);
} else if (data[mid] < key) {
recursiveBinarySearch(data, mid + 1, high, key);
}
}
return -1;
}
冒泡排序
冒泡排序:就是每趟从待排序的数组中比较相邻两个数字的大小,将数字小的放在前面,数字大的放在后面;重复第一趟的操作,直到完成排序为止。
- 冒泡排序的排序方法如下图
public class BubbleSort {
public static void main(String[] args) {
int[] myArray = {18,91,38,77,36,55,74,30,2,41};
System.out.println("排序前的数组为:");
for(int i=0;i<myArray.length;i++) {
System.out.print(myArray[i]+" ");
}
//冒泡排序算法
for(int i=0;i<myArray.length-1;i++) {
for(int j=0;j<myArray.length-1-i;j++) {
if(myArray[j]>myArray[j+1]) {
int temp = myArray[j];
myArray[j] = myArray[j+1];
myArray[j+1] = temp;
}
}
}
System.out.println();
System.out.println("排序后的数组为:");
for(int i=0;i<myArray.length;i++) {
System.out.print(myArray[i]+" ");
}
}
}
选择排序
选择排序:就是每次从一组待排序的数组中找到最小值(或最大值)然后与该序列的起始位置进行替换,以此类推,直到待排序的数组排序好为止。
- 选择排序的演示如下图
public class SelectionSort {
public static void main(String[] args) {
int[] myArray = {18,91,38,77,36,55,74,30,2,41};
System.out.println("排序前的数组为:");
for(int i=0;i<myArray.length;i++) {
System.out.print(myArray[i]+" ");
}
//选择排序算法
for(int i=0;i<myArray.length;i++) {
for(int j=i+1;j<myArray.length;j++) {
int min = myArray[i];
if(min>myArray[j]) {
int temp = myArray[i];
myArray[i] = myArray[j];
myArray[j] = temp;
}
}
}
System.out.println();
System.out.println("排序后的数组为:");
for(int i=0;i<myArray.length;i++) {
System.out.print(myArray[i]+" ");
}
}
}
教材学习中的问题和解决过程
- 问题1:
问题1解决方案:
- 问题2:
问题2解决方案:
代码调试中的问题和解决过程
- 问题1:
- 问题1解决方案:
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
上周无考试
____
结对及互评
评分标准
- 基于评分标准,我给本博客打分:14分。得分情况如下:
正确使用Markdown语法(加1分):
不使用Markdown不加分
有语法错误的不加分(链接打不开,表格不对,列表不正确...)
排版混乱的不加分
- 模板中的要素齐全(加1分)
- 缺少“教材学习中的问题和解决过程”的不加分
- 缺少“代码调试中的问题和解决过程”的不加分
- 代码托管不能打开的不加分
- 缺少“结对及互评”的不能打开的不加分
- 缺少“上周考试错题总结”的不能加分
- 缺少“进度条”的不能加分
- 缺少“参考资料”的不能加分
教材学习中的问题和解决过程, 一个问题加1分
代码调试中的问题和解决过程, 一个问题加1分
- 本周有效代码超过300分行的(加2分)
- 一周提交次数少于20次的不加分
- 其他加分:
- 感想,体会不假大空的加1分
- 排版精美的加一分
- 进度条中记录学习时间与改进情况的加1分
- 有动手写新代码的加1分
- 课后选择题有验证的加1分
- 代码Commit Message规范的加1分
- 错题学习深入的加1分
- 点评认真,能指出博客和代码中的问题的加1分
- 结对学习情况真实可信的加1分
点评过的同学博客和代码
- 本周结对学习情况
- 对队列的一些讨论和学习。包括链表和数组实现队列,入队、出队等等
- 上周博客互评情况
经过本周的学习,我对曾经学过的知识有了更深一步的了解同时对数据查找和排序等方法的应用也更加熟悉,同时也弄懂了一些过去不是很懂的知识点可谓是受益匪浅。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 126/126 | 2/2 | 20/20 | |
第二周 | 0/126 | 2/2 | 20/40 | |
第三周 | 353/479 | 2/6 | 20/60 | |
第四周 | 1760/2239 | 2/8 | 30/90 | |
第五周 | 1366/3615 | 2/10 | 20/110 | |
第六周 | 534/4149 | 2/12 | 20/130 | |
第七周 | 2800/6949 | 2/12 | 20/150 | |
第八周 |