linearsearch:线性查找:一种查找方式,从列表项的一端开始,按线性方式进行,直到找到要查找的元素,或达到了列表的末端(代表没有找到要查找的元素)。html
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; }
logarithmic sort:对数排序、种排序算法,若是要给n个元素进行排序,须要大约nlog2n
次比较操做。java
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; }
二分查找的复杂度是对数级的,这使得它对于大型查找池很是有效率·git
public static <T extends Comparable<T>> void selectionSort(T[] data) { int min; T temp; for (int index = 0; index < data.length-1; index++) { min = index; for (int scan = index+1; scan < data.length; scan++) if (data[scan].compareTo(data[min])<0) min = scan; swap(data, min, index); } } private static <T extends Comparable<T>> void swap(T[] data, int index1, int index2) { T temp = data[index1]; data[index1] = data[index2]; data[index2] = temp; }
public static <T extends Comparable<T>> void insertionSort(T[] data) { for (int index = 1; index < data.length; index++) { T key = data[index]; int position = index; // shift larger values to the right while (position > 0 && data[position-1].compareTo(key) > 0) { data[position] = data[position-1]; position--; } data[position] = key; } }
public static <T extends Comparable<T>> void bubbleSort(T[] data) { int position, scan; T temp; for (position = data.length - 1; position >= 0; position--) { for (scan = 0; scan <= position - 1; scan++) { if (data[scan].compareTo(data[scan+1]) > 0) swap(data, scan, scan + 1); } } }
public static <T extends Comparable<T>> void quickSort(T[] data) { quickSort(data, 0, data.length - 1); } private static <T extends Comparable<T>> void quickSort(T[] data, int min, int max) { if (min < max) { int indexofpartition = partition(data, min, max); quickSort(data, min, indexofpartition - 1); quickSort(data, indexofpartition + 1, max); } } private static <T extends Comparable<T>> int partition(T[] data, int min, int max) { T partitionelement; int left, right; int middle = (min + max) / 2; partitionelement = data[middle]; swap(data, middle, min); left = min; right = max; while (left < right) { while (left < right && data[left].compareTo(partitionelement) <= 0) left++; while (data[right].compareTo(partitionelement) > 0) right--; if (left < right) swap(data, left, right); } swap(data, min, right); return right; }
public static <T extends Comparable<T>> void mergeSort(T[] data) { mergeSort(data, 0, data.length - 1); } private static <T extends Comparable<T>> void mergeSort(T[] data, int min, int max) { if (min < max) { int mid = (min + max) / 2; mergeSort(data, min, mid); mergeSort(data, mid+1, max); merge(data, min, mid, max); } } @SuppressWarnings("unchecked") private static <T extends Comparable<T>> void merge(T[] data, int first, int mid, int last) { T[] temp = (T[])(new Comparable[data.length]); int first1 = first, last1 = mid; // endpoints of first subarray int first2 = mid+1, last2 = last; // endpoints of second subarray int index = first1; // next index open in temp array while (first1 <= last1 && first2 <= last2) { if (data[first1].compareTo(data[first2]) < 0) { temp[index] = data[first1]; first1++; } else { temp[index] = data[first2]; first2++; } index++; } while (first1 <= last1) { temp[index] = data[first1]; first1++; index++; } while (first2 <= last2) { temp[index] = data[first2]; first2++; index++; } for (index = first; index <= last; index++) data[index] = temp[index]; }
基数排序是基于队列处理的。算法
sequentialsort:顺序排序:一种排序算法,一般使用嵌套循环,须要大约n2次比较来给n
个元素排序。数组
viablecandidates:可行候选:查找池中的元素,在这些元素中可能找到目标元素。数据结构
问题1解决方案:学习
问题2解决方案:
(1)若n较小(如n≤50),可采用直接插入或直接选择排序。
当记录规模较小时,直接插入排序较好;不然由于直接选择移动的记录数少于直接插人,应选直接选择排序为宜。
(2)若文件初始状态基本有序(指正序),则应选用直接插人、冒泡或随机的快速排序为宜;
(3)若n较大,则应采用时间复杂度为O(nlgn)的排序方法:快速排序、堆排序或归并排序。
快速排序是目前基于比较的内部排序中被认为是最好的方法,当待排序的关键字是随机分布时,快速排序的平均时间最短;
堆排序所需的辅助空间少于快速排序,而且不会出现快速排序可能出现的最坏状况。这两种排序都是不稳定的。
若要求排序稳定,则可选用归并排序。但前面介绍的从单个记录起进行两两归并的排序算法并不值得提倡,一般能够将它和直接插入排序结合在一块儿使用。先利用直接插入排序求得较长的有序子序列,而后再两两归并之。由于直接插入排序是稳定 的,因此改进后的归并排序还是稳定的。
---------------------
做者:Seven17000
来源:CSDN
原文:https://blog.csdn.net/mbuger/article/details/67643185?utm_source=copy
版权声明:本文为博主原创文章,转载请附上博文连接!测试
问题1:pp9.2运行出现ui
问题1解决方案:这是一个很是常见的异常,从名字上看是数组下标越界错误,解决方法就是查看为何下标越界。
for (int j = 0;j<=data.length-i;j++) {
这是我错误的条件,后来我发现应该这样写for (int j = 0;j<=data.length-1-i;j++) {
最后测试成功.net
参考了博客java获取程序执行时间
第一种是以毫秒为单位计算的。
//伪代码
long startTime=System.currentTimeMillis(); //获取开始时间
doSomeThing(); //测试的代码段
long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间: "+(end-start)+"ms");
//伪代码
long startTime=System.currentTimeMillis(); //获取开始时间
doSomeThing(); //测试的代码段
long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间: "+(end-start)+"ms");
第二种是以纳秒为单位计算的。
//伪代码
long startTime=System.nanoTime(); //获取开始时间
doSomeThing(); //测试的代码段
long endTime=System.nanoTime(); //获取结束时间
System.out.println("程序运行时间: "+(end-start)+"ns");
//伪代码
long startTime=System.nanoTime(); //获取开始时间
doSomeThing(); //测试的代码段
long endTime=System.nanoTime(); //获取结束时间
System.out.println("程序运行时间: "+(end-start)+"ns");
上周无错题
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0/0 | 1/1 | 8/8 | |
第二周 | 500/500 | 1/2 | 15/ 23 | |
第三周 | 802/1302 | 1/3 | 12/35 | |
第四周 | 1530/2832 | 2/5 | 15/50 | |
第五周 | 1165/3997 | 1/6 | 10/60 |