折半插入排序 之通俗易懂,圖文+代碼詳解-java編程


轉自http://blog.csdn.net/nzfxx/article/details/51615439

1.特點及概念介紹

    下面給大家講解一下"二分法查找"這個java基礎查找算法,那么什么是二分法呢?其實所謂的"二分法",就是一分為二的意思,綜合起來理解就是一分為二的查找,但大家記住了,二分法是建立在"已經按順序排好"的基礎條件上,如果大家把這個二分法查找理解清楚了,那么會有助於你更好的理解快速排序,下面我就羅列出該算法的特點:

    1.定義起始位置start(0角標),定義末位置end(lenght-1位置,即最后一位)
    2.無限循環的查找一個值,先看看該值是不是在中間mid角標,mid=(star+end)/2
    3.如果該值大於mid角標對應值,那么start變成mid的右邊一位,如果小於,那么end就變成mid的左邊一位,這樣會極其的高效.
    5.找到值就返回值或打印,找不着也返回-1或打印,並停止循環.
  6.在排序中關鍵字比較次數同記錄初始排列無關的

 

 


2.圖文描述過程

這里寫圖片描述


現有需求:

1.有一個已經排列好順序的從小到大的數組.
2.請查詢一個數字所在的角標位置.
3.如果元素不存在,請給出如果插入,那么應該插入的位置.

 

3.代碼詳情(參考 https://www.cnblogs.com/snowcan/p/6244361.html)

 
         
public class BinaryInsertSort {

public static void main(String[] args) {
// TODO Auto-generated method stub
int[] arr = {3,1,5,7,2,4,9,6};
new BinaryInsertSort().binaryInsertSort(arr);
}

/**
* 折半插入排序算法的實現
*/
public void binaryInsertSort(int[] arr){
int n=arr.length;
int i,j;
for (i=1;i<n;i++){
int temp=arr[i];
int low=0;
int high=i-1;
while (low<=high){
int mid=low+(high-low)/2;
if(temp>arr[mid]){
low=mid+1;
}else if(temp<arr[mid]){
high=mid-1;
}
}
for (j=i-1;j>=low;j--){
arr[j+1]=arr[j];
}
arr[low]=temp;
/**
* 打印每次循環的結果
*/
printProcess(arr,n,i);
}
/**
* 打印排序結果
*/
printResult(arr,n);
}

/**
* 打印排序的最終結果
* @param arr
* @param n
*/
private void printResult(int[] arr, int n) {
System.out.print("最終排序結果:");
for(int j=0;j<n;j++){
System.out.print(" "+arr[j]);
}
System.out.println();
}

/**
* 打印排序的每次循環的結果
* @param arr
* @param n
* @param i
*/
private void printProcess(int[] arr, int n, int i) {
System.out.print("第"+i+"次:");
for(int j=0;j<n;j++){
System.out.print(" "+arr[j]);
}
System.out.println();
}
}
 
運行結果:
第1次: 1 3 5 7 2 4 9 6
第2次: 1 3 5 7 2 4 9 6
第3次: 1 3 5 7 2 4 9 6
第4次: 1 2 3 5 7 4 9 6
第5次: 1 2 3 4 5 7 9 6
第6次: 1 2 3 4 5 7 9 6
第7次: 1 2 3 4 5 6 7 9
最終排序結果: 1 2 3 4 5 6 7 9

 


4.總結:

二分法查找,又稱折半查找,大家需要記住的重點有

1.優點是比較次數少,查找速度快,平均性能好;
其缺點是要求待查表為有序表,且插入刪除困難。
因此,折半查找方法適用於不經常變動而查找頻繁的有序列表。
它的算法要求是必須是順序存儲結構,必須有序排列2.確定最左邊的start,最右邊的end 3.無限循環當中找mid角標對應的值,start和end會根據情況改變 4.當發現start和end交叉,那么證明找不到,即如果放入該元素,那么就應該放在此時的start位置.
5.使用二分查找算法在一個有序序列中查找一個元素的時間復雜度為(logn )。
原因:折半查找,每次都是1/2,設尋找t次,等式為2t =n,n為數據的總數,倒過來就答案B。
總共有n個元素,漸漸跟下去就是n,n/2,n/4,....n/2^k(接下來操作元素的剩余個數),其中k就是循環的次數,由於你n/2^k取整后>=1,即令n/2^k=1
6.設有序順序表中有n個數據元素,則利用二分查找法查找數據元素X的最多比較次數不超過 log2n+1
因為二分查找每次排除掉一半的不適合值,所以對於n個元素的情況:
一次二分剩下:n/2
兩次二分剩下:n/2/2 = n/4
......
m次二分剩下:n/(2^m)
在最壞情況下是在排除到只剩下最后一個值之后得到結果,所以為
 n/(2^m)=1;
  2^m=n;
  此時時間復雜度為log2(n)
  再與最后一個元素比較復雜度+1
   所以時間復雜度為:log2(n)+1
 


免責聲明!

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



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