JavaScript 一些简单算法

其实这是前一阵子写的了 今天复习一下又发现记得不牢靠 所以决定放到博客上面

各种排序和二分查找以及原始版的数组去重

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


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

function newBubbleSort(arr) {
  var l = arr.length;
  for (var i = 0; i < l - 1; i++) {
    var flag = true;
    for (var j = 0; j < l - i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        [arr[j + 1], arr[j]] = [arr[j], arr[j + 1]]
        flag = false
      }
    }
    if (flag) {
      return arr
    }
  }
  return arr
}

var arrtest = [];
for (var d = 1; d < 10000; d++) {
  arrtest.push(d)
}

console.time('kankan')
bubbleSort(arrtest);
console.timeEnd('kankan')
//优化冒泡----有任何一轮没有发生任何交换就说明已经排好了
console.time('youhua');
newBubbleSort(arrtest)
console.timeEnd('youhua');


//再来一个插入排序 
function insert(arr) {
  var l = arr.length;
  for (var i = 1; i < l; i++) {
    var temp = arr[i];
    var j = i;
    while (j > 0 && arr[j - 1] > temp) {
      arr[j] = arr[j - 1];
      j--;
    }
    arr[j] = temp;
  }
  return arr;
}
// 3 5 1
console.log(insert([3, 5, 1, 10, 15, 25, 69, 88, 5555, 15, 15, 7, 6, 2]))

function binarySearchNormal (arr,target) {
  var
    start = 0,
    end = arr.length - 1;
  while(start <= end) {
    mid = parseInt((start + end)/2) ;
    if (target == arr[mid]) {
      return mid
    }
    if (target > arr[mid]) {
      start = mid + 1
    }else{
      end = mid - 1
    }
  }
  return -1
}

console.log(binarySearch([1,2,3,6,99999],3))
//再来一个递归的二分查找
function binarySearch(arr, tar, start, end) {
  if(start > end){
    return false;
  }
  var
    start = start || 0,
    end = end || arr.length - 1,
    mid = parseInt((start + end) / 2)
  if (arr[mid] === tar) {
    return mid
  }
  if (arr[mid] < tar) {
    return binarySearch(arr, tar, mid + 1, end)
  } else {
    return binarySearch(arr, tar, start, mid - 1)
  }

}
console.log(binarySearch([1, 2, 3, 5, 6, 7, 10, 15, 15, 15, 25, 69, 88, 5555], 1))

//再来一个快速排序
function quickSort (arr) {
  if(arr.length < 2){return arr}
  let left = [],
  right = [],
  pivotIndex = Math.floor(arr.length/2),
  pivot = arr[pivotIndex]
  for(var i = 0;i < arr.length;i++){
    if(i === pivotIndex){continue}
    if (arr[i] < pivot) {
      left.push(arr[i])
    }else{
      right.push(arr[i])
    }
  }
  return quickSort(left).concat([pivot],quickSort(right))
}
console.log(quickSort([3, 5, 1, 10, 15, 25, 69, 88, 5555, 15, 15, 7, 6, 2]))

//再来一个原始版的数组去重
function unique (arr) {
  var temp = [],
  l = arr.length
  for(var i = 0;i < l;i++){
    for(var j = i+1;j < l;j++){
      if(arr[i]===arr[j]){
        i++;
        j = i;
      }
    }
    temp.push(arr[i])
  }
  return temp
}
console.log(unique([3, 5, 1, 1, 15, 5, 69, 88, 5555, 15, 15, 7, 6, 2]))

三种方法实现trim

function trim_l(str) {
  while (str.startsWith(' ')) {
    str = str.substr(1)
  }
  return str
}

function trim_r(str) {
   while(str.endsWith(' ')){
     str = str.substr(0,str.length-1)
  }
  return str
}

function my_trim(str) {
  str = trim_l(str);
  str = trim_r(str);
  return str
}
console.log(my_trim(" 4556  "));

//--------------------------------------------------------------
function LTrim(str) {
  var i;
  for (i = 0; i < str.length; i++) {
    if (str.charAt(i) != " ") break;
  }
  str = str.substring(i, str.length);
  return str;
}

function RTrim(str) {
  var i;
  for (i = str.length - 1; i >= 0; i--) {
    if (str.charAt(i) != " ") break;
  }
  str = str.substring(0, i+1);
  return str;
}

function Trim(str) {
  return LTrim(RTrim(str));
}
console.log(Trim(" 4556  "));

//-------------------------------------------------------------
function reg_trim (str) {
  return str.replace(/(^\s*)|(\s*$)/g,'')
}
console.log(reg_trim(" 4556  "))

给定年月日 判断是这一年的第几天

// 判断是否为闰年
function isRun(a) {
    return a % 4 == 0 && a % 100 != 0 || a % 400 == 0
}

// 判断是这一年的第几天
function daysNum(year,month,day) {
    var months = [31,28,31,30,31,30,31,31,30,31,30,31];
    if(month ==1)  {
        return day;
    }
    for(var i = 0; i < month-1; i++) {
        day += months[i]
    }
    if(isRun(year) && month >2) {
        day ++
    }
    return day
}

寻找多数元素

设计一个方法,在一个数组中寻找占大多数的元素(如果存在的话),如果这样的元素不存在,就输出“没有元素占大多数”。
eg:
输入:[3,3,4,2,4,4,2,4,4]
输出:4 // 一共5个4,超过数组长度的一半
Input: [3,3,4,2,4,4,2,4,]
Output:没有元素占大多数

function SelectNum(arr) {
    let len = arr.length;
    var json = {};
    for (let i = 0; i < len; i++) {
        if (json[arr[i]] == undefined) {
            json[arr[i]] = 1;
        } else {
            json[arr[i]] += 1
        }
    }
    for (let a in json) {
        if (json[a] > len / 2) {
            return a
        }
    }

    return '没有元素占大多数'
}

猜你喜欢

转载自blog.csdn.net/qaqLjj/article/details/86410737