對於數組,按順序比較給定的值,時間複雜度0(n),,如下是實現:html
public static int Linear_Search(int[] data, int key) { if (data == null || data.length <= 0) { return -1; } for (int i = 0; i < data.length; i++) { if (data[i] == key) { return i; } } return -1; }
二分查找是針對已有序的序列進行的高效查找,時間複雜度0(n),,如下是實現:git
public static int binarySearch(int[] data, int key) { if (data == null || data.length <= 0) { return -1; } int low = 0; int high = data.length - 1; while (low < high) { int mid = (low + high) / 2; if (data[mid] == key) { return mid; } else if (data[mid] > key) { high = mid - 1; } else if (data[mid] < key) { low = mid + 1; } } return -1; } /** * 二分查找的前提是有序,遞歸 * * @param data * @param key * @return */ public static int recursiveBinarySearch(int[] data, int low, int high, int key) { if (data == null || data.length <= 0) { return -1; } if (low < high) { int mid = (low + high) / 2; if (data[mid] == key) { return mid; } else if (data[mid] > key) { recursiveBinarySearch(data, low, mid - 1, key); } else if (data[mid] < key) { recursiveBinarySearch(data, mid + 1, high, key); } } return -1; }
冒泡排序:就是每趟從待排序的數組中比較相鄰兩個數字的大小,將數字小的放在前面,數字大的放在後面;重複第一趟的操做,直到完成排序爲止。算法
public class BubbleSort { public static void main(String[] args) { int[] myArray = {18,91,38,77,36,55,74,30,2,41}; System.out.println("排序前的數組爲:"); for(int i=0;i<myArray.length;i++) { System.out.print(myArray[i]+" "); } //冒泡排序算法 for(int i=0;i<myArray.length-1;i++) { for(int j=0;j<myArray.length-1-i;j++) { if(myArray[j]>myArray[j+1]) { int temp = myArray[j]; myArray[j] = myArray[j+1]; myArray[j+1] = temp; } } } System.out.println(); System.out.println("排序後的數組爲:"); for(int i=0;i<myArray.length;i++) { System.out.print(myArray[i]+" "); } } }
選擇排序:就是每次從一組待排序的數組中找到最小值(或最大值)而後與該序列的起始位置進行替換,以此類推,直到待排序的數組排序好爲止。數組
public class SelectionSort { public static void main(String[] args) { int[] myArray = {18,91,38,77,36,55,74,30,2,41}; System.out.println("排序前的數組爲:"); for(int i=0;i<myArray.length;i++) { System.out.print(myArray[i]+" "); } //選擇排序算法 for(int i=0;i<myArray.length;i++) { for(int j=i+1;j<myArray.length;j++) { int min = myArray[i]; if(min>myArray[j]) { int temp = myArray[i]; myArray[i] = myArray[j]; myArray[j] = temp; } } } System.out.println(); System.out.println("排序後的數組爲:"); for(int i=0;i<myArray.length;i++) { System.out.print(myArray[i]+" "); } } }
插入排序
- a、默認從第二個數據開始比較。數據結構
- b、若是第二個數據比第一個小,則交換。而後在用第三個數據比較,若是比前面小,則插入(交換)。不然,退出循環
- c、說明:默認將第一數據當作有序列表,後面無序的列表循環每個數據,若是比前面的數據小則插入(交換)。不然退出。學習
- d、代碼實現設計
插入排序的運行方式以下圖調試
public static void main(String[] args) { int arr[] = {7, 5, 3, 2, 4}; //插入排序 for (int i = 1; i < arr.length; i++) { //外層循環,從第二個開始比較 for (int j = i; j > 0; j--) { //內存循環,與前面排好序的數據比較,若是後面的數據小於前面的則交換 if (arr[j] < arr[j - 1]) { int temp = arr[j - 1]; arr[j - 1] = arr[j]; arr[j] = temp; } else { //若是不小於,說明插入完畢,退出內層循環 break; } } } }
問題1解決方案:二分查找有它自身的限制,就是必定要在有序數組中查找,不然會出現錯誤.
所以應該在有序數組中使用二分查找,無序數組中使用順序查找更好code
問題2解決方案:這個問題是我看書不夠仔細,後來在書中找到了這種狀況下該怎麼辦。應該忽略小數部分,取兩個中點的第一個爲新的中點。而後繼續搜索。htm
問題1:快速排序卡死i=j=5的進程中
問題1解決方案:
把while(i <= j)改爲while(i!=1)
(statistics.sh腳本的運行結果截圖)
上週無考試
____
正確使用Markdown語法(加1分):
不使用Markdown不加分
有語法錯誤的不加分(連接打不開,表格不對,列表不正確...)
排版混亂的不加分
教材學習中的問題和解決過程, 一個問題加1分
代碼調試中的問題和解決過程, 一個問題加1分
通過本週的學習,我對曾經學過的知識有了更深一步的瞭解同時對數據查找和排序等方法的應用也更加熟悉,同時也弄懂了一些過去不是很懂的知識點可謂是受益不淺。
代碼行數(新增/累積) | 博客量(新增/累積) | 學習時間(新增/累積) | 重要成長 | |
---|---|---|---|---|
目標 | 5000行 | 30篇 | 400小時 | |
第一週 | 126/126 | 2/2 | 20/20 | |
第二週 | 0/126 | 2/2 | 20/40 | |
第三週 | 353/479 | 2/6 | 20/60 | |
第四周 | 1760/2239 | 2/8 | 30/90 | |
第五週 | 1366/3615 | 2/10 | 20/110 | |
第六週 | 534/4149 | 2/12 | 20/130 | |
第七週 | 2800/6949 | 2/12 | 20/150 | |
第八週 | 883/7832 | 2/12 | 20/170 |