插入排序


什么是插入排序

什么是插入排序?想到插入我脑子里冒出来一个相近的词就是插队,我那时还在上大二,排在食堂一楼打饭,忽然来了一个没素质的一顿操作猛如虎地插到了我前面,唉,这人没救了!我当时就在想能不能用插入排序来描述这件事,后来发现不行,也就是说插队不是插入排序生活中的体现。我想到一个更为恰当的例子,那就是打扑克打双扣,有经验的选手他往往是这样的,右手抓到一张牌放入左手,然后右手再去抓一张牌去跟左手的牌作对比,如果比它小就放前面,比它大就放后面,重复楼上的动作,直到这位选手抓完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\repos\JavaScript-Tsukuki\code\sort-study> npm run test:insert

> sort-study@1.0.0 test:insert E:\document\repos\JavaScript-Tsukuki\code\sort-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\repos\JavaScript-Tsukuki\code\sort-study> 

最后

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

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