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

排序

一  冒泡

  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);

 

 

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/softwarelanguagebs/p/10596542.html