每日前端手写题--day11

以下题目来自掘金等其它博客,但是问题的答案都是根据笔者自己的理解做出的。如果你最近想要换工作或者巩固一下自己的前端知识基础,不妨和我一起参与到每日刷题的过程中来,如何?

第11天要刷的手写题如下:

  1. 使用js实现选择排序
  2. 使用js实现插入排序
  3. 使用js实现希尔排序

下面是我自己写的答案:

1. 使用js实现选择排序

  • 原理:遍历数组,将搜索当前索引位置及之后的元素中的最小值,找到之后和当前索引位置的元素交换位置。
  • 简单来说就是:选择剩余数组中最小的值放到有序数组末尾。
  • 技巧:将数组元素交换过程和寻找剩余数组中最小元素的过程抽离成独立方法可以使整个过程更加清晰。
js 复制代码
function selectSort(source) {
    const _tmp = [...source];
    // 寻找指定区间之内的最小值对应的下标
    const findMinIndex = (start, end) => {
        let _curMin = _tmp[end];
        let _curMinIndex = end;
        for (let i = start; i <= end; i++) {
            if (_tmp[i] < _curMin) {
                _curMin = _tmp[i];
                _curMinIndex = i;
            }
        }
        return _curMinIndex;
    }
    // 交换数组两个元素
    const swap = (i, j) => {
        if (i === j) return;
        [_tmp[i], _tmp[j]] = [_tmp[j], _tmp[i]];
    }
    // 遍历,并且交换顺序
    for (let i = 0; i < _tmp.length; i++) {
        const _curMinIndex = findMinIndex(i, _tmp.length - 1);
        swap(i, _curMinIndex);
    }

    return _tmp;
}

const a = [0, 5, 36, 5, 6, 6, 58, 2, 3, 6]; // [0, 2, 3, 5, 5, 6, 6, 6, 36, 58]
console.log(selectSort(a));
  1. 使用js实现插入排序
  • 原理:将元素插入到已经存在的有序数组中去
  • 实现过程:遍历数组,将当前索引位置的元素插入到此索引位置之前的有序数组中去
  • 理解:假如现在遍历到的索引位置为n,则[0...n-1]已经是有数组了,对于n索引位置的元素x,遍历[0...n-1],找到x应该所在的位置p,将[p...n-1]的元素逐个向后移动,变成[p+1...n],然后将x放到p位置上。
  • 难点:p=0的情况的处理
js 复制代码
function insertSortClassic(source) {
    const _tmp = [...source];
    const _len = _tmp.length;

    for (let i = 1; i < _len; i++) {
        const current = _tmp[i]; // 当前待插入元素
        let j = i - 1; // 拟插入位置

        while (j >= 0 && _tmp[j] > current) {
            _tmp[j + 1] = _tmp[j]; // 元素后移
            j -= 1;
        }

        _tmp[j + 1] = current; // 插入当前元素到正确位置
    }

    return _tmp;
}

const b = [0, 5, 36, 5, 6, 6, 58, 2, 3, 6]; // [0, 2, 3, 5, 5, 6, 6, 6, 36, 58]
console.log(insertSort(b))

3. 使用js实现希尔排序

  • 捷径:改造插入排序算法,获得希尔排序算法
    *
    1. 引入gap,初始值为1;将原来插入排序中的所有1用gap替换
      1. 给原来插入排序和循环外面加一层循环(希尔排序的精髓所在)
      1. 将gap的初始值从1修改成数组长度的一半,直接从插入排序变成希尔排序
js 复制代码
function shellSort(source) {
   const _tmp = [...source];
   const _len = _tmp.length;
   let gap = _len >> 1; // 改动1

   while (gap) { // 改动2
       for (let i = gap; i < _len; i++) {
           const current = _tmp[i];
           let j = i - gap;
   
           while (j >= 0 && _tmp[j] > current) {
               _tmp[j + gap] = _tmp[j];
               j -= gap;
           }
   
           _tmp[j + gap] = current; 
       }
   
       gap = gap >> 1; // 改动3
   }


   return _tmp;
}

const c = [0, 5, 36, 5, 6, 6, 58, 2, 3, 6]; // [0, 2, 3, 5, 5, 6, 6, 6, 36, 58]
console.log(shellSort(c))

后记:虽然实现希尔排序基于插入排序,但是对于希尔排序本身还是需要掌握其原理的:

  • 希尔排序的实现过程:
    *
    1. 生成gap数列
      1. 对于每一个gap值排序
  • 误区:
    • 第二步对于每一个gap值排序的时候,不一定要使用插入排序
相关推荐
SuperherRo1 分钟前
JS逆向-安全辅助项目&Yakit热加载&魔术方法&模版插件语法&JSRpc进阶调用&接口联动
javascript·安全·yakit·jsrpc·热加载
用户47949283569153 分钟前
用|运算符写管道?Symbol.toPrimitive让JavaScript提前用上|>语法
前端·javascript
知识分享小能手20 分钟前
uni-app 入门学习教程,从入门到精通,uni-app 基础知识详解 (2)
前端·javascript·windows·学习·微信小程序·小程序·uni-app
文心快码BaiduComate29 分钟前
限时集福!Comate挂件/皮肤上线,符(福)气掉落中~
前端·后端·程序员
勇敢di牛牛29 分钟前
vue3 + mars3D 三分钟画一个地球
前端·vue.js
ssshooter1 小时前
MCP 服务 Streamable HTTP 和 SSE 的区别
人工智能·面试·程序员
IT_陈寒1 小时前
Python+AI实战:用LangChain构建智能问答系统的5个核心技巧
前端·人工智能·后端
DIY机器人工房2 小时前
【嵌入式面试题】STM32F103C8T6 完整元器件解析 + 面试问题答案
stm32·单片机·面试·嵌入式·面试题·diy机器人工房
袁煦丞2 小时前
MoneyPrinterTurbo一键生成短视频:cpolar内网穿透实验室第644个成功挑战
前端·程序员·远程工作
代码小学僧2 小时前
让 AI 真正帮你开发:前端 MCP 实用技巧分享
前端