排序數組
一 冒泡函數
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);