public static <T extends Comparable<T>> boolean linearSearch(T[] data, int min, int max, T 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; }
从初始的查找区间开始,每通过一次与当前查找区间的中点位置上的结点值的比较,便可判断查找是否成功,不成功则当前的查找区间便缩小一半。这一过程一直重复,直至找到待查找值的位置,或者直至当前的查找区间为空(即查找失败)为止。html
第n次查询 | 剩余待查询元素的数量 |
---|---|
1 | N/2 |
2 | N/(2^2) |
3 | N/(2^3) |
4 | N/(2^4) |
5 | N/(2^5) |
6 | N/(2^6) |
······ | ······ |
······ | ······ |
K | N/(2^K) |
代码实现: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; }
选择排序(Selection Sort): 在要排序的一组数中,选出最小的一个数与第一个位置的数交换;而后在剩下的数当中再找最小的与第二个位置的数交换,如此循环到倒数第二个数和最后一个数比较为止。
node
代码实现:git
public static <T extends Comparable<T>> void selectionSort(T[] data) { long startTime=System.nanoTime(); //获取开始时间 int Total_number_of_comparisons = 0; int min; T temp; for (int index = 0; index < data.length-1; index++) { min = index; for (int scan = index+1; scan < data.length; scan++) { Total_number_of_comparisons++; if (data[scan].compareTo(data[min])<0) { min = scan; } } swap(data, min, index); } long endTime=System.nanoTime(); //获取结束时间 System.out.println("程序运行时间: "+(endTime-startTime)+"ns"); System.out.println("总比较次数: " + Total_number_of_comparisons); }
在肯定最小值后,将其和存储在索引位置处的值交换。算法
代码实现:数组
public static <T extends Comparable<T>> void insertionSort(T[] data) { long startTime=System.nanoTime(); //获取开始时间 int Total_number_of_comparisons = 0; 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--; Total_number_of_comparisons++; } data[position] = key; } long endTime=System.nanoTime(); //获取结束时间 System.out.println("程序运行时间: "+(endTime-startTime)+"ns"); System.out.println("总比较次数: " + Total_number_of_comparisons); }
若当前插入值小于position的值,则将该值移位至右边。数据结构
冒泡排序(Bubble Sort): 重复地走访过要排序的数列,一次比较两个元素,若是他们的顺序错误就把他们交换过来。走访数列的工做是重复地进行直到没有再须要交换,也就是说该数列已经排序完成,越小的元素会经由交换慢慢“浮”到数列的顶端。
学习
public static <T extends Comparable<T>> void bubbleSort(T[] data) { long startTime=System.nanoTime(); //获取开始时间 int Total_number_of_comparisons = 0; 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); } Total_number_of_comparisons++; } } long endTime=System.nanoTime(); //获取结束时间 System.out.println("程序运行时间: "+(endTime-startTime)+"ns"); System.out.println("总比较次数: " + Total_number_of_comparisons); }
public void Bubble_sort(Linked_list_node Head,Linked_list linked_list){ Linked_list_node temp = null, tail = null; temp = head; int count=1; while(temp.next != tail){ while(temp.next != tail){ if(temp.number > temp.next.number){ int temp_number = temp.number; temp.number = temp.next.number; temp.next.number = temp_number; System.out.print("The list sorted by the "+ count + " truly bubbling sort is : "); System.out.println(linked_list); System.out.print("The number of linked elements is : " + linked_list.getCount() + "\n" ); count++; } temp = temp.next; } tail = temp; temp = head; } }
快速排序(Quick Sort): 经过一趟排序将待排序记录分割成独立的两部分,其中一部分记录的关键字均比另外一部分关键字小,则分别对这两部分继续进行排序,直到整个序列有序。
ui
代码实现:.net
private static <T extends Comparable<T>> int partition(T[] data, int min, int max) { T partitionelement; int left, right; int middle = (min + max) / 2; // use the middle data value as the partition element partitionelement = data[middle]; // move it out of the way for now swap(data, middle, min); left = min; right = max; 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); return right; }
private static <T extends Comparable<T>> void quickSort(T[] data, int min, int max) { if (min < max) { // create partitions int indexofpartition = partition(data, min, max); // sort the left partition (lower values) quickSort(data, min, indexofpartition - 1); // sort the right partition (higher values) quickSort(data, indexofpartition + 1, max); } }
归并排序(Merge Sort): 将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每一个子序列是有序的。而后再把有序子序列合并为总体有序序列。
9.3 基数排序法
问题1:PP9.2的题意吃得不是很透彻。
仿照冒泡排序法,个人初始代码是这样的,这里间隔为2:
错题1:无任何错题。
解决:
错题2:
解决:
错题3:
解决:
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | |
---|---|---|---|
目标 | 3000行 | 15篇 | 300小时 |
第一周 | 0/0 | 1/1 | 12/12 |
第二周 | 935/935 | 1/2 | 24/36 |
第三周 | 849/1784 | 1/3 | 34/70 |
第四周 | 3600/5384 | 1/5 | 50/120 |
第五周 | 2254/7638 | 1/7 | 50/170 |