内容简介:插入排序之所以叫插入排序,你可以这样理解:假设你在打通常我们需要将牌排好序,那么这个时候你是怎样排序的呢?
插入 排序 之所以叫插入排序,你可以这样理解:
假设你在打 扑克牌
通常我们需要将牌排好序,那么这个时候你是怎样排序的呢?
首先
我们手里一张牌都没有。
然后
我们拿到 第一张
牌这时候他不需要排序,也就是说它是 有序的
。
所以我们可以得到如下代码。
function insertionSort(arr) { // 第一张牌是有序的直接放入数组 const result = [arr[0]]; return result; } 复制代码
紧接着我们拿到了第二张牌,这张牌可能比手里原有的牌大,也可能小,也可能相等只是花色不一样。
这时不论大小与否,你都要确定你想怎么排列它,我的意思是你要在升降序这两个选项里做一个抉择。
假设你选择了升序:
(注意:虽然手里只有一张牌但是,还是需要遍历整个牌组。)
那么如果这张牌比第一张大,你会接着比较这张牌是否比第二张牌大,直到你找出这张牌 比前一张牌大但是比后一张牌小
的位置,将它 插入
. (总结起来就是只要这张牌比与他比较的牌小就插入在这张牌之前,否则接着比较)
降序则是 比前一张牌小但是比后一张牌大
。
这时我们得到
function insertionSort(arr) { // 第一张牌是有序的直接放入数组 const result = [arr[0]]; const { length } = arr; // 这层循环是模拟发除第一张牌以外剩下的牌 for (let i = 1; i < length; i++) { const original = result.length; // 这层循环是将新发下来的牌与手里的每一张牌比较看看它比哪张大,比哪张小。 for (let j = 0; j < original; j++) { // 只要这张牌比与他比较的牌小 if (result[j] > arr[i]) { // 就插入在这张牌之前 result.splice(j, 0, arr[i]); // 插入之后结束本轮比较 break; } // 否则接着比较 } // 比所有的都大 } return result; } 复制代码
其中有两个特殊情况
1、 这张牌是最小的
最小的牌直接在最前面插入 复制代码
这种情况前面的代码已经包括了直接插入
2、 这张牌是最大的
最大的牌直接在最后面插入 复制代码
这种情况的代码如下:
function insertionSort(arr) { // 第一张牌是有序的直接放入数组 const result = [arr[0]]; const { length } = arr; // 这层循环是模拟发除第一张牌以外剩下的牌 for (let i = 1; i < length; i++) { const oldLen = result.length; // 这层循环是将新发下来的牌与手里的每一张牌比较看看它比哪张大,比哪张小。 for (let j = 0; j < oldLen; j++) { // 只要这张牌比与他比较的牌小 if (result[j] > arr[i]) { // 就插入在这张牌之前 result.splice(j, 0, arr[i]); // 插入之后结束本轮比较 break; } // 否则接着比较 } // 比所有的都大说明没有插入手牌说明手里的牌没有增多 if (oldLen === result.length) { result.push(arr[i]); } } return result; } 复制代码
至此排序过程完成需要测试一下。
如何使用 mocha 测试 排序算法
mocha 是做单元格测试的 npm 包之一。还有其他的,就不介绍了。
1、首先需要下载 mocha
yarn global add mocha 复制代码
或者:
sudo npm i mocha -g 复制代码
2、新建 test.js 文件 或者新建 test/test.js 也行看个人喜好。
3、官网有一个例子
var assert = require('assert'); // 引入测试包 describe('Array', function() { // 描述 数组 describe('#indexOf()', function() { // 的 indexOf 函数 // 在找不到对应元素的情况下应该返回 -1 it('should return -1 when the value is not present', function() { assert.equal([1, 2, 3].indexOf(4), -1); // 第一个人参数是要测试的函数 , 第二个参数是结果 。 }); }); }); 复制代码
结果:
测试一个 排序算法 是否正确我准备了 4 个例子 (被测试数据 => 期望结果)
1、正整数
[1,3,2] => [1,2,3] 复制代码
describe('insertionSort([1,3,2])',function(){ // 描述 函数排序 [1,3,2] it('should return [1,2,3]',function(){ // 应该返回 [1,2,3] assert.equal( JSON.stringify(insertionSort([1,3,2])), JSON.stringify([1,2,3]) ) // 第一个参数的返回值应该等于第二个参数 }) }) 复制代码
2、负数
[-1,-3,-2] => [-3,-2,-1] 复制代码
describe('insertionSort([-1,-3,-2])',function(){ it('should return [-3,-2,-1]',function(){ assert.equal( JSON.stringify(insertionSort([-1,-3,-2])), JSON.stringify([-3,-2,-1]) ) }) }) 复制代码
3、小数
[0.1,-0.1,0] => [-0.1,0,0.1] 复制代码
describe('insertionSort([0.1,-0.1,0])',function(){ it('should return [-0.1,0,0.1]',function(){ assert.equal( JSON.stringify(insertionSort([0.1,-0.1,0])), JSON.stringify([-0.1,0,0.1]) ) }) }) 复制代码
4、 综合
[3,2,1,11,22,33,-33,-22,-11,-3,-4,-5,3.3,1.1,1.01] => [-33, -22, -11, -5, -4, -3, 1, 1.01, 1.1, 2, 3, 3.3, 11, 22, 33] 复制代码
describe('insertionSort([3,2,1,11,22,33,-33,-22,-11,-3,-4,-5,3.3,1.1,1.01])',function(){ it('should return [-33, -22, -11, -5, -4, -3, 1, 1.01, 1.1, 2, 3, 3.3, 11, 22, 33]',function(){ assert.equal( JSON.stringify(insertionSort([3,2,1,11,22,33,-33,-22,-11,-3,-4,-5,3.3,1.1,1.01])), JSON.stringify([-33, -22, -11, -5, -4, -3, 1, 1.01, 1.1, 2, 3, 3.3, 11, 22, 33]) ) }) }) 复制代码
测试结果:
(完)
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- HashMap为何从头插入改为尾插入
- C++拾趣——STL容器的插入、删除、遍历和查找操作性能对比(Windows VirtualStudio)——插入
- HashMap之元素插入
- 插入排序
- PHP 实现插入排序
- 特殊排序——二分+插入排序
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Beautiful Code
Greg Wilson、Andy Oram / O'Reilly Media / 2007-7-6 / GBP 35.99
In this unique work, leading computer scientists discuss how they found unusual, carefully designed solutions to difficult problems. This book lets the reader look over the shoulder of major coding an......一起来看看 《Beautiful Code》 这本书的介绍吧!