插入排序
什么是插入排序
什么是插入排序?想到插入我脑子里冒出来一个相近的词就是插队,我那时还在上大二,排在食堂一楼打饭,忽然来了一个没素质的一顿操作猛如虎地插到了我前面,唉,这人没救了!我当时就在想能不能用插入排序来描述这件事,后来发现不行,也就是说插队不是插入排序生活中的体现。我想到一个更为恰当的例子,那就是打扑克打双扣,有经验的选手他往往是这样的,右手抓到一张牌放入左手,然后右手再去抓一张牌去跟左手的牌作对比,如果比它小就放前面,比它大就放后面,重复楼上的动作,直到这位选手抓完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 国际许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用