數組排序 和 二分法查找


二分法查找

當數據量很大適宜采用該方法。采用二分法查找時,數據需是有序不重復的。 基本思想:假設數據是按升序排序的,對於給定值 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;
   }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM