經常使用算法之---排序 和 查找

 

排序數組

一  冒泡函數

  1  原理測試

     經過屢次嵌套循環比對交換位置;最終將有序的小的數字排在前面,大的排在後面;每一趟排序完成後會肯定一個數字的最終位置。ui

 

   2  demospa

   let arr=[6,3,8,2,9,1];
 let temp=0;
 for(let i=0;i<arr.length-1;i++){  //外層循環排序趟數,剩餘最後一個數字的時候,位置已肯定因此最後一個沒必要比對。
      for(let j=0;j<arr.length-1-i;j++){//內層循環每一趟比對多少次,每次比對後都會進一步縮小下次比對範圍。
        if(arr[j]>arr[j+1]){
          temp=arr[j];
          arr[j]=arr[j+1];
          arr[j+1]=temp;
        }
      }
    } 指針

   console.log(arr);對象

 

 

 

二   快排排序

 1  原理遞歸

    就是一個無序的數組,拿一個看成參考,排序後,把全部比他小的放到左邊,比他大的放到右邊,而後 經過遞歸的方法,分別對左邊和右邊進行 排序。索引

    PS:基準老是取序列開頭的元素.

 

 

 2   demo

console.time("快排");  //能夠記錄開始執行時間

     

function quicksort(a,left,right){
if(left>right){ //必定要有這個判斷,由於有遞歸left和i-1,若沒有這個判斷條件,該函數會進入無限死錯位遞歸
return;
}

var i=left,
j=right,
jizhun=a[left]; //基準老是取序列開頭的元素

while(i!=j){ //該while的功能爲每一趟進行的屢次比較和交換最終找到位置k。當i==j時意味着找到k位置了
while(a[j]>=jizhun&&i<j){j--} //只要大於等於基準數,j指針向左移動直到小於基準數纔不進入該while。i<j的限制條件也是很重要,否則一直在i!=j這個循環裏,j也會越界
while(a[i]<=jizhun&&i<j){i++} //只要小於等於基準數,i指針向右移動直到大於基準數纔不進入該while。等於條件也是必要的,舉例[4,7,6,4,3]驗證一下是兩個4交換
if(i<j){ //若是i==j跳出外層while
t=a[i];
a[i]=a[j];
a[j]=t
}
}

a[left]=a[i];//交換基準數和k位置上的數
a[i]=jizhun;

quicksort(a,left,i-1);
quicksort(a,i+1,right);
}

var array=[4,7,2,8,3,9,12];
console.log(quicksort(array,0,array.length-1));//排完序後再看array是[2, 3, 4, 7, 8, 9, 12]

 

console.timeEnd("快排");  //能夠記錄結束執行時間

 

 

 

 

 

 

 

 

查找

 二分法查找

1  原理
須要是有序的數組, 那要查找的值,和序列最中間的值對比,(加入是升序),那麼小於對比的值 就往前面查找,
若是大於這個值,就日後面查找。

取中間值爲比較對象,若等於關鍵字,則查找成功;若大於關鍵字,則在比較對象的左半區繼續查找;若小於關鍵字,則在比較對象的右半區繼續查找。不斷重複上述過程直到查找成功,若全部查找區域無記錄則查找失敗。

 

 

 

2  demo

private int halfSearch(int[] arr, int target){
        int min = 0;//數組最小索引
        int max = arr.length - 1;//數組最大索引
        int mid = (min + max) / 2;//數組中間索引
        
        int i = 0;
        while(true){
            System.out.println("第" + ++i + "次,min:" + min + ";mid:" + mid + ";max:" + max);
            //跟中間值進行比較
            if (target > arr[mid]) {
                min = mid + 1;
            }
            else if (target < arr[mid]) {
                max = mid - 1;
            }
            else if(target == arr[mid]){
                return mid;
            }
            //從新取中間索引
            mid = (min + max) / 2;
            //若是最小索引大於最大索引說明有問題,直接返回
            if (min > max) {
                return -1;
            }
        }
    }

    

         測試:::

        int[] arr = {10, 12, 15, 17, 19, 20, 22, 23, 24, 25, 30, 31, 32, 33, 34, 35, 40, 41, 42, 43, 44, 45, 46};
        int target = 32;
        
        int index = halfSearch(arr, target);
        System.out.println(index);
相關文章
相關標籤/搜索