代码改变世界

javascript 排序和搜索算法

2018-03-12 11:18  库奇——  阅读(226)  评论(0编辑  收藏  举报

 

排序算法

1冒泡排序 

学习排序算法时,通常都先学冒泡算法,因为它在所有排序算法中最简单。然而,从运行时间的角度来看,冒泡排序是最差的一个。

冒泡排序比较任何两个相邻的项,如果第一个比第二个大,则交换它们。元素项向上移动至正确的顺序,就好像气泡升至表面一样,冒泡排序因此得名。

function sort(arr){
    var len = arr.length;
    for(var i = 0; i < len;i++){
        for(var j = 0;j < len-1;j++){
            if(arr[j]>arr[j+1]){
                var temp = arr[j];
                arr[j] = arr[j+1];
                arr[j+1] = temp
            }
        }    
    }
    return arr      
}

2:选择排序:

选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。

function select(arr){
    for(var i = 0;i < arr.length-1;i++){
        for(var j= i+1;j<arr.length;j++){
            if(arr[i]>arr[j]){
                var t = arr[i];
                arr[i] = arr[j];
                arr[j] = t
            }
        }
    }
       return arr;  
}

3:快速排序

快速排序是找出一个元素作为基准,然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。

 

function quickSort(arr){
  if(arr.length<=1){
    return arr;
  }
  var midIndex = Math.floor(arr.length/2);
  var midValue = arr.splice(midIndex,1);
  var left = [];
  var right = [];
  for(var i = 0;i < arr.length; i++){
    if(arr[i] < midValue){
      left.push(arr[i])
    }else{
      right.push(arr[i])
    }
  }
  return quickSort(left).concat(midValue,quickSort(right)) }

 4 插入排序

  插入排序:插入排序原理:它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。

function insertSort(arr){
  var len = arr.length;
  for(var i = 1;i < len; i++){
    if(arr[i] < arr[i-1]){
      var ele = arr[i];
      var j = i-1;
      arr[i] = arr[j];
      while(j>=0 && ele<arr[j]){
        arr[j+1] = arr[j];
        j--
      }
      arr[j+1] = ele;
    }
  }
  return arr; }

5:归并排序

归并排序是一种分治算法。其思想是将原始数组切分成较小的数组,直到每个小数组只有一个位置,接着将小数组归并成较大的数组,直到最后只有一个排序完毕的大数组。


function merge(left, right) {
  var result = [];
  while(left.length > 0 && right.length > 0) {
    if(left[0] < right[0]) {
      result.push(left.shift());
    }
    else {
      result.push(right.shift());
    }
  }

  return result.concat(left).concat(right);
}
function mergeSort(arr){
  if(arr.length==1) {

    return arr

  };
  var mid=Math.floor(arr.length/2);
  var left_arr=arr.slice(0,mid);
  var right_arr=arr.slice(mid);
  return merge(mergeSort(left_arr),mergeSort(right_arr));
}

var arr=[12,20,30,21,15,33,26,19,40,25]

mergeSort(arr)

 

搜索算法

1顺序搜索

顺序或线性搜索是最基本的搜索算法。它的机制是,将每一个数据结构中的元素和我们要找的元素做比较。顺序搜索是最低效的一种搜索算法。

以下是其实现:

this.sequentialSearch = function(item){
  for (var i=0; i<array.length; i++){ //{1}
    if (item === array[i]) //{2}
      return i; //{3}
    }
  }
  return -1; //{4}
};

2 :二分搜索

这个算法要求被搜索的数据结构已排序。以下是该算法遵循的步骤。

(1) 选择数组的中间值。
(2) 如果选中值是待搜索值,那么算法执行完毕(值找到了)。
(3) 如果待搜索值比选中值要小,则返回步骤1并在选中值左边的子数组中寻找。
(4) 如果待搜索值比选中值要大,则返回步骤1并在选种值右边的子数组中寻找

function binarySearch (arr,item){
    //先排序
    arr.sort(function(val1,val2){
        return val1 - val2
    })
    var low = 0;
  var high = arr.length -1;
  var mid;
  var element;
  while(low <= high){
    mid = Math.floor((low + high)/2);//中间索引
    element = arr[mid];
    if(item > element){
      low = mid + 1;
    }else if(item < element){
      high = mid -1;
    }else{
      return mid
    }
  }
  return -1;

}