public static <T extends Comparable<T>> Booolean linearSearch(T[] data,int min,int max,T target);
Searching.linearSearch(targetarray,min,max,target)
public static <T> boolean linearSearch(T[] data, int min, int max, T target) { int index = min; boolean found = false; while (!found && index <= max) { found = data[index].equals(target); index++; } return found; }
public static <T extends Comparable<T>> boolean binarySearch(T[] data, int min, int max, T target) { boolean found = false; int midpoint = (min + max) / 2; // determine the midpoint if (data[midpoint].compareTo(target) == 0) found = true; else if (data[midpoint].compareTo(target) > 0) { if (min <= midpoint - 1) found = binarySearch(data, min, midpoint - 1, target); } else if (midpoint + 1 <= max) found = binarySearch(data, midpoint + 1, max, target); return found; } }
midpoint = (min + max) / 2
,当min+max
所得数值是基数的时候,会自动转化成int类型,直接忽略小数部分,也就是肯定中点索引时选择的是两个中间值的第一个(小一点的)。快速排序的平均时间复杂度为O(nlogn)。在全部平均时间复杂度为O(nlogn)的算法中,快速排序的平均性能是最好的。
html
while (left < right) { // search for an element that is > the partition element while (left < right && data[left].compareTo(partitionelement) <= 0) left++; // search for an element that is < the partition element while (data[right].compareTo(partitionelement) > 0) right--; // swap the elements if (left < right) swap(data, left, right); } // move the partition element into place swap(data, min, right);
两个内层while循环用于寻找位于错误分区的交换元素,第一个循环从左边扫到右边,寻找大于分区元素的元素,第二个循环从右边扫到左边,寻找小于分区元素的元素,在找到这两个元素后,将他们互换,该过程会一直持续下去直到左索引和右索引在该列表的“中间”相遇。java
归并排序:经过递归地把列表分半,直到每一个子列表中只剩下一个元素为止,而后归并这些子列表。
git
这是一篇介绍的很详细的博客,你们能够参考理解桶子法排序原理和实现算法
for (int digitVal = 0; digitVal <= 9; digitVal++) digitQueues[digitVal] = (Queue<Integer>)(new LinkedList<Integer>());
Queue<Integer>[] digitQueues = (LinkedList<Integer>[])(new LinkedList[10]);
中,最初建立的数组中含有十个队列,那为何创造10个队列呢?经过Debug跟着程序走一遍,我才明白原来这10个队列是分别保存不一样的关键字取值。而每个数字位上可取0~9的数字,故建立了包含10个队列的数组。digit = Character.digit(temp.charAt(3-position), 10);
,隐隐约约以为Character是一个类,而digit是里面的静态方法,从代码的实现目的来看,应该是获得特殊位置的元素值。问题2的解决:经过查询JavaAPI文档,获得以下的解释。
其实意思就是将3-position
这个位置上的数字值返回。数组
1.在作pp9.2的时候程序写完后借用Contact的测试类来测试新的gapSort方法,没有报错可是排序直接没有改变。
数据结构
问题1的解决:实际上是很简单的错误,又检查了一遍就发现了问题所在,当进行外循环的时候,while语句中应该是知足的条件,而不是跳出循环的条件,在内循环中,只要从比较position-i
次便可,这样全部数字均可以遍历比较到了。
性能
第一种是以毫秒为单位计算的。 long startTime = System.currentTimeMillis(); //获取开始时间 doSomething(); //测试的代码段 long endTime = System.currentTimeMillis(); //获取结束时间 System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间 第二种是以纳秒为单位计算的。 long startTime=System.nanoTime(); //获取开始时间 doSomeThing(); //测试的代码段 long endTime=System.nanoTime(); //获取结束时间 System.out.println("程序运行时间: "+(endTime-startTime)+"ns");
问题的改正和理解:因为队列操做会修改集合的两端,所以将一端固定在索引0处要求移动元素,这样就会使得元素移位产生O(n)的复杂度,而环形数组能够除去在队列数组实现中把元素移位的须要。本道题不应错,也不知道是点错了仍是当时理解错题目了学习
public static <T extends Comparable<? super T>>
的理解实在到位,并且那个盘装水果然的妙啊。纸上得来终觉浅,绝知此事要躬行。测试
在本周的学习过程当中,其实连得来纸上也花费了一番功夫,尤为是后面的快速排序、归并排序和基数排序。.net
大二其实也不算悠闲,天天过的仍是很充实。曾经了解过工做外8小时决定人生理论,因此不少时候咱们要去往哪里也是一点一点时间累积着告诉咱们的。时间安排对一个成年人过重要了,我渐渐意识到本身的生命正由于有局限才有不一样的阶段、不一样的须要、不一样的安排。
知道我是谁,我要作什么就好。
原本上面就是这周想说的所有内容了,可是又手欠看了几篇班里同窗的博客,真的是太敬佩了。真的有一种个人做业太差了不敢交的感受。就像小时候写做文写的不工整不敢交的感受如出一辙。捂脸逃跑~~~
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
第一周 | 0/0 | 1/1 | 8/8 |
第二周 | 621/621 | 1/2 | 12/20 |
第三周 | 678/1299 | 1/3 | 10/30 |
第四周 | 2734/4033 | 1/4 | 20/50 |
第五周 | 1100/5133 | 1/5 | 20/70 |