学号20182317 2019-2020-1 《数据结构与面向对象程序设计》第八周学习总结

学号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]+" ");
		}
	}
 
}

插入排序

插入排序
- a、默认从第二个数据开始比较。

-  b、如果第二个数据比第一个小,则交换。然后在用第三个数据比较,如果比前面小,则插入(交换)。否则,退出循环

 -  c、说明:默认将第一数据看成有序列表,后面无序的列表循环每一个数据,如果比前面的数据小则插入(交换)。否则退出。

 -  d、代码实现

插入排序的运行方式如下图

public static void main(String[] args) {

        int arr[] = {7, 5, 3, 2, 4};

        //插入排序
        for (int i = 1; i < arr.length; i++) {
            //外层循环,从第二个开始比较
            for (int j = i; j > 0; j--) {
                //内存循环,与前面排好序的数据比较,如果后面的数据小于前面的则交换
                if (arr[j] < arr[j - 1]) {
                    int temp = arr[j - 1];
                    arr[j - 1] = arr[j];
                    arr[j] = temp;
                } else {
                    //如果不小于,说明插入完毕,退出内层循环
                    break;
                }
            }
        }
    }

教材学习中的问题和解决过程

  • 问题1:二分查找是不是一定要比顺序查找效率更高一点呢

  • 问题1解决方案:二分查找有它自身的限制,就是一定要在有序数组中查找,否则会出现错误.
    因此应该在有序数组中使用二分查找,无序数组中使用顺序查找更好

  • 问题2:在二分搜索中,会从中间开始分段,就像数学中的二分法一样,但是如果所有的排列数是偶数,这样的话,中间就没有数字,这种情况下该怎么办?

  • 问题2解决方案:这个问题是我看书不够仔细,后来在书中找到了这种情况下该怎么办。应该忽略小数部分,取两个中点的第一个为新的中点。然后继续搜索。

代码调试中的问题和解决过程

  • 问题1:快速排序卡死i=j=5的进程中

  • 问题1解决方案:
    把while(i <= j)改成while(i!=1)

代码托管

(statistics.sh脚本的运行结果截图)


上周考试错题总结

上周无考试


结对及互评

评分标准

  • 基于评分标准,我给本博客打分:14分。得分情况如下:
  1. 正确使用Markdown语法(加1分):

    • 不使用Markdown不加分

    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)

    • 排版混乱的不加分

  2. 模板中的要素齐全(加1分)

    • 缺少“教材学习中的问题和解决过程”的不加分
    • 缺少“代码调试中的问题和解决过程”的不加分
    • 代码托管不能打开的不加分
    • 缺少“结对及互评”的不能打开的不加分
    • 缺少“上周考试错题总结”的不能加分
    • 缺少“进度条”的不能加分
    • 缺少“参考资料”的不能加分
  3. 教材学习中的问题和解决过程, 一个问题加1分

  4. 代码调试中的问题和解决过程, 一个问题加1分

  5. 本周有效代码超过300分行的(加2分)

    • 一周提交次数少于20次的不加分
  6. 其他加分:

    • 感想,体会不假大空的加1分
    • 排版精美的加一分
    • 进度条中记录学习时间与改进情况的加1分
    • 有动手写新代码的加1分
    • 课后选择题有验证的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分
    • 点评认真,能指出博客和代码中的问题的加1分
    • 结对学习情况真实可信的加1分

点评过的同学博客和代码

  • 本周结对学习情况
    • 20182318
    • 20182333
    • 结对学习内容
      • 对一些程序渐进复杂度的计算
      • 对栈的一些讨论和学习。包括出栈,入栈,删除等等
  • 对队列的一些讨论和学习。包括链表和数组实现队列,入队、出队等等
  • 上周博客互评情况

其他(感悟、思考等,可选)

经过本周的学习,我对曾经学过的知识有了更深一步的了解同时对数据查找和排序等方法的应用也更加熟悉,同时也弄懂了一些过去不是很懂的知识点可谓是受益匪浅。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 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 | |
| 第八周 | 883/7832 | 2/12 | 20/170 | |

参考资料

posted @ 2019-11-04 15:43  20182317彭衍泰  阅读(201)  评论(2编辑  收藏  举报