排序
一 冒泡
1 原理
通过多次嵌套循环比对交换位置;最终将有序的小的数字排在前面,大的排在后面;每一趟排序完成后会确定一个数字的最终位置。
2 demo
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);