• 插入排序


    什么是插入排序

    什么是插入排序?想到插入我脑子里冒出来一个相近的词就是插队,我那时还在上大二,排在食堂一楼打饭,忽然来了一个没素质的一顿操作猛如虎地插到了我前面,唉,这人没救了!我当时就在想能不能用插入排序来描述这件事,后来发现不行,也就是说插队不是插入排序生活中的体现。我想到一个更为恰当的例子,那就是打扑克打双扣,有经验的选手他往往是这样的,右手抓到一张牌放入左手,然后右手再去抓一张牌去跟左手的牌作对比,如果比它小就放前面,比它大就放后面,重复楼上的动作,直到这位选手抓完27张牌后,他的左手应该握有一把美丽的扇子。好的,在理解完插入排序生活中的例子后,我们开始给它下个定义:

    给定一组数据集,遍历这组数据集,每次拿当前遍历的元素与其前面元素的有序数据集的元素进行比较,将其插入相应的位置,我们将这种排序算法称之为“插入排序”。

    实现一个插入排序

    思路

    大致是这样子,在已给定的数据集中,我们先拿第一个和第二个元素比大小排序,之后进行第二次循环,我们将第三个元素与已经排好序的第一个和第二个数据集中的元素进行比大小,将其插入合适位置,重复这个行为直至遍历到最后一个元素,至此,排序完成。

    code

    export default (arr) => {
      for (let i = 1; i < arr.length; i++) {
        for (let j = i - 1; j >= 0 && arr[j] > arr[j + 1]; j--) {
          [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
        }
      }
      return arr;
    }
    

    test

    test case

    import insertSort from '../src/insert';
    
    
    test('insert sort: test case 1', () => {
      expect(insertSort([2, 4, 3, 1])).toEqual([1, 2, 3, 4]);
    });
    
    test('insert sort: test case 2', () => {
      expect(insertSort([2, 0, 2, 0])).toEqual([0, 0, 2, 2]);
    });
    
    test('insert sort: test case 3', () => {
      expect(insertSort([1, 9, 9, 7])).toEqual([1, 7, 9, 9]);
    });
    
    test('insert sort: test case 4', () => {
      expect(insertSort([0, 6, 1, 3])).toEqual([0, 1, 3, 6]);
    });
    

    test result

    PS E:document
    eposJavaScript-Tsukukicodesort-study> npm run test:insert
    
    > sort-study@1.0.0 test:insert E:document
    eposJavaScript-Tsukukicodesort-study
    > jest test/insert.test.js
    
     PASS  test/insert.test.js
      √ insert sort: test case 1 (5 ms)
      √ insert sort: test case 2
      √ insert sort: test case 3
      √ insert sort: test case 4
    
    Test Suites: 1 passed, 1 total
    Tests:       4 passed, 4 total
    Snapshots:   0 total
    Time:        7.645 s, estimated 22 s
    Ran all test suites matching /test\insert.test.js/i.
    PS E:document
    eposJavaScript-Tsukukicodesort-study> 
    

    最后

    本文选自Javascript筑基专题文章,项目地址:https://github.com/ataola/JavaScript-Tsukuki

    知识共享许可协议
    本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

  • 相关阅读:
    JVM系列之:String.intern和stringTable
    一文了解JDK12 13 14 GC调优秘籍-附PDF下载
    JVM系列之:对象的锁状态和同步
    JVM系列之:Contend注解和false-sharing
    十分钟搭建自己的私有NuGet服务器-BaGet
    .Net Core in Docker极简入门(下篇)
    .Net Core in Docker极简入门(上篇)
    Flutter 实现酷炫的3D效果
    2020年20个Flutter最漂亮的UI库和项目
    Python 为什么能支持任意的真值判断?
  • 原文地址:https://www.cnblogs.com/cnroadbridge/p/13599518.html
Copyright © 2020-2023  润新知