二分法查找
當數據量很大適宜采用該方法。采用二分法查找時,數據需是有序不重復的。 基本思想:假設數據是按升序排序的,對於給定值 x,從序列的中間位置開始比較,如果當前位置值等於 x,則查找成功;若 x 小於當前位置值,則在數列的前半段中查找;若 x 大於當前位置值則在數列的后半段中繼續查找,直到找到為止。
假設有一個數組 {5,4,2, 67, 77, 89, 90,4,9,1,12, 23, 34, 45, 56 },現要求采用二分法找出指定的數值並將其在數組的索引返回,如果沒有找到則返回 -1
首先要做到的就是給數組進行排序
一般有四種方法:快速排序法、冒泡法、選擇排序法、插入排序法。
快速排序法主要是運用了Arrays中的一個方法Arrays.sort()實現。
冒泡法是運用遍歷數組進行比較,通過不斷的比較將最小值或者最大值一個一個的遍歷出來。
選擇排序法是將數組的第一個數據作為最大或者最小的值,然后通過比較循環,輸出有序的數組。
插入排序是選擇一個數組中的數據,通過不斷的插入比較最后進行排序。下面我就將他們的實現方法一一詳解供大家參考。
利用Arrays帶有的排序方法快速排序
Arrays.sort()方法根據傳出參數的長度的大小來判斷用哪種排序方法,如果數組的長度小於7用冒泡排序,如果數組長度大於7,將數組分為兩部分,前半部分和后半部分分別進行冒泡排序,最后再執行一次總的排序
import java.util.Arrays; public class Test2{ public static void main(String[] args){ int[] a={5,4,2,4,9,1}; Arrays.sort(a); //進行排序 for(int i: a){ System.out.print(i); } } }
冒泡排序算法
原理:從數組的第一個位置開始兩兩比較array[index]和array[index+1],如果array[index]大於array[index+1]則交換array[index]和array[index+1]的位置,止到數組結束;
從數組的第一個位置開始,重復上面的動作,止到數組長度減一個位置結束;
從數組的第一個位置開始,重復上面的動作,止到數組長度減二個位置結束;
。。。。
public static int[] bubbleSort(int[] args){//冒泡排序算法 for(int i=0;i<args.length-1;i++){ for(int j=i+1;j<args.length;j++){ if (args[i]>args[j]){ int temp=args[i]; args[i]=args[j]; args[j]=temp; } } } return args; }
選擇排序算法:
原理:選擇一個值array[0]作為標桿,然后循環找到除這個值外最小的值(查找小於標桿的最小值),交換這兩個值,這時最小值就被放到了array[0]上,然后再將array[1]作為標桿,從剩下未排序的值中找到最小值,並交換這兩個值。
冒泡排序是每一次都可能要交換 而選擇排序是在比較時記下a[i]的位置 最后來交換 所以他們的交換過程是不一樣的 而查找的過程是一樣的,效率不會比冒泡的低...
public static int[] selectSort(int[] args){//選擇排序算法 for (int i=0;i<args.length-1 ;i++ ){ int min=i; for (int j=i+1;j<args.length ;j++ ){ if (args[min]>args[j]){ min=j; } } if (min!=i){ int temp=args[i]; args[i]=args[min]; args[min]=temp; } } return args; }
插入排序算法
原理:插入排序的思想是數組是部分有序的,然后將無序的部分循環插入到已有序的序列中
public static int[] insertSort(int[] args){//插入排序算法 for(int i=1;i<args.length;i++){ for(int j=i;j>0;j--){ if(args[j]<args[j-1]){ int temp=args[j-1]; args[j-1]=args[j]; args[j]=temp; }else break; } } return args; }
===================================================================================================
=================================================================================================
在排序完成之后再使用二分法
public class DichotomySearch { public static void main(String[] args) { int[] arr = new int[] { 12, 23, 34, 45, 56, 67, 77, 89, 90 }; System.out.println(search(arr, 12)); System.out.println(search(arr, 45)); System.out.println(search(arr, 67)); System.out.println(search(arr, 89)); System.out.println(search(arr, 99)); } public static int search(int[] arr, int key) { int start = 0; int end = arr.length - 1; while (start <= end) { int middle = (start + end) / 2; if (key < arr[middle]) { end = middle - 1; } else if (key > arr[middle]) { start = middle + 1; } else { return middle; } } return -1; } }