深复制和二分法

1. 手写深复制

思路1

接收需要深复制的数据,返回深复制数据
1. 首先判断数据类型,如果是基本数据类型,直接返回
2. 如果是引用数据类型,判断是数组还是对象
3. 如果是数组,遍历数组,将每一项进行深复制,然后将复制后的数据push到一个新的数组中,最后返回新的数组
4. 如果是对象,遍历对象,将每一项进行深复制,然后将复制后的数据添加到一个新的对象中,最后返回新的对象
代码实现:
function deepClone(obj) {
  if (typeof obj !== 'object' || obj === null) {
    return obj
  }
  let result
  if (Array.isArray(obj)) {
    result = []
    for (let i = 0; i < obj.length; i++) {
      result.push(deepClone(obj[i]))
    }
  } else {
    result = {}
    for (let key in obj) {
      result[key] = deepClone(obj[key])
    }
  }
  return result
}

思路2

接收需要深复制的数据和需要递归的初始化数据(防止报错),返回深复制数据
1. 首先判断数据类型,如果是基本数据类型,直接返回
2. 如果接收的数据是引用类型,则直接for in遍历, 判断该数据下的每个属性的类型
3. 如果属性是基础类型直接返回,否则判断是数组还是对象,对象就给当前返回值初始化{}, 数组则是[], 最后执行递归自身。(用的就是基础类型不共享同一指针,引用类型指向同一指针的原理实现深复制)
const deepCopy = (parent, child) => {
  if (typeof parent !== 'object' || parent === null) {
    return parent
  }
  const value = child || {};

  for (var i in parent) {
    if (typeof parent[i] === 'object') {
      value[i] = (parent[i].constructor === Array) ? [] : {};
      deepCopy(parent[i], value[i]);
    } else {
      value[i] = parent[i];
    }
  }
  return value;
}
// const a = {
//   b: {
//     c: 1,
//   },
//   d: [2,3,4,5],
//   e: 6
// }
// console.log(deepCopy(a));

2. 快速排序(Quicksort)的Javascript实现

接收一个数组:[11,55,34,78,99,24,66,88,46];
输出:[11,24,34,46,55,66,78,88,99];

思路: 使用二分法
第一步:处理异常,如果数组长度小于等于1直接返回
第二步:获取一个数组的中间,定义左边和右边的空数组
第三步:遍历接收的数组,划分大左边或者右边的数据里
第四步:输出【递归左边】【中间数】【递归右边】直到左边和右边只有一个数字
第5步: 使用concat连接得到【左边,终究数,右边】,这时就已经完成了排序。
const quicksort = (arr: number[]) => {
  const len = arr.length;
  if (len <= 1) return arr;
  const middId = Math.floor(len / 2);
  const middValue = arr.splice(middId, 1)[0];
  const leftArr: number[] = [];
  const rightArr: number[] = [];
  for (let i = 0; i < arr.length; i ++) {
    if (arr[i] <= middValue) {
      leftArr.push(arr[i]);
    } else {
      rightArr.push(arr[i]);
    }
  }
  return quicksort(leftArr).concat(middValue).concat(quicksort(rightArr));
}

// quicksort([11,55,34,78,99,24,66,88,46])

 

posted @ 2024-03-18 10:14  君临天下之徐少  阅读(9)  评论(0)    收藏  举报