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 |