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 |