整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

JavaScript插入排序算法通俗说明

JavaScript插入排序算法通俗说明

入排序概述

插入排序是将数组分为待排序和已排序两个区间。依次从待排序区间中取出一项,用该项跟已排序区间项逐个对比,通过位移来实现插入到对应位置的排序方式。插入排序平均时间复杂度是:O(n^2)

步骤是:

  1. 先建立两个循环,外循环用于遍历待排序区间,内循环用来遍历已排序区间。
  2. 从待排序中按顺序取出一项暂存起来,将该项自右往左与已排序项逐个对比,当遇到比自己大的项(表示升序)时,将该位置右移1位。
  3. 再将待排序区间里右移后空出来的位置赋值为暂存项。此时已排序区间增加了一项,待排序区间减少了一项,继续第2步直到待排序遍历完成。

插入排序实现

插入排序有多种实现方式,这里介绍常见的3种:

1、通用实现方式,自左往右遍历待排序数组,再从当前的左侧位置开始自右往左循环已排序数组,再逐个比较和移动被比较项,最后将当前项填入到空缺位置上。

2、利用数组splice方法,类似打扑克牌,先拿出要排序的牌,然后找准位置插入。这种方式利用了原生API,减少了数组反复移动位置的操作。性能上之前差不多。

3、新建数组法与splice结合法,这种方式会多建立一个数组,也就会多占用一个空间,但理解起来最容易,也利用了JS语言的特性。

插入排序通俗说明

插入排序与冒泡、选择都是比较简单好懂的排序方式,性能上也差不多。插入排序通俗来讲就像打扑克牌排序,你抓了一手牌之后。假如是:2、1、5、3、4,你会:

1、先把牌分成两组,假定左侧第一张牌为一组(标识A,这时只有2),其他牌为另外一组(标识B,包括1、5、3、4)。

2、从B组里面从左起选择第一张牌(位置空出等待填充),也就是1,拿这张牌与A组里面从右往左挨个对比,当遇到比这张牌还小时就在这个位置停留下来(如果A组全部比这张牌都大那就在A组最前面停留下来,如果A组里没有比这张牌大的就在当前位置停留)。

3、然后将A组里比这张牌(也就是1)大的牌逐个往右移动1位,原B组空出位置被填充,此时刚才停留的位置空出,将1这张牌插入在这里。这时候A组增加一个数字,变为:1、2,B组减少1个,变为:5、3、4。

4、移动指针,继续指向B组的第一个,也就是5。用5这张牌重复第二部,即拿5去跟A组自右往左逐个比较,然后插入到A组。此时A组:1、2、5,B组:3、4。

5、将B组里数字按照第二部重复操作,直到B组为空时整个循环结束。此时A组为:1、2、3、4、5。

我们都知道普通的HTML自带的功能相对有限,很多复杂的交互式场景,如果手动去写功能的话会非常的复杂,而且可扩展性差,就拿HTML表格来说,对于初学者或者对于复杂的拖拽式交互编程不熟悉的话会很浪费时间,因此今天就介绍一个第三方的插件——Table-draagger,来轻松实现类似的功能。Table-draagger是用于构建可重排序的拖放表的极简主义纯Javascript库!



Github

https://github.com/sindu12jun/table-dragger


特征

Table-draagger因为其以下几个特征而让拖拽和排序的实现变得如此简单:

  • 非常容易配置
  • 能够同时对列或行进行排序
  • 排序时动画流畅
  • 没有臃肿的依赖
  • 提供触摸事件(意味着在触摸设备可以实现一些你想要的功能)


安装使用

  • 安装

可以在npm上获得它:

npm install table-dragger --save

或者引用压缩的js文件

<script src="../node_modules/table-dragger/dist/table-dragger.min.js"></script>

或者尝试开发中的不稳定版本

npm install table-dragger@next --save

  • 快速入门

请看以下代码:

import tableDragger from 'table-dragger'
tableDragger(el, options?)

<table id="table">
<thead>
<tr>
<th class='handle'>header1</th>
<th class='handle'>header2</th>
</tr>
</thead>
<tbody>
<tr>
<td>conten1</td>
<td>conten2</td>
</tr>
</tbody>
</table>

var el=document.getElementById('table');
var dragger=tableDragger(el, {
mode: 'row',
dragHandler: '.handle',
onlyBody: true,
});
dragger.on('drop',function(from, to){
console(from);
console(to);
});

你可以在不设置任何参数的情况下使用默认的拖拽和排序方式,当然以下是你可以配置的选项:

  • options.mode

1、将mode设置为column,用户拖动和排序表的列

2、将mode设置为row,用户拖动并排序表的行

3、设置mode为free,用户根据点击后鼠标移动的方向拖动行或列。注意,必须在自由模式下指定dragHandler。

  • options.dragHandler

dragHandler是表中的拖动句柄选择器默认情况下,在列模式下,dragHandler是表的第一行;在行模式下,则是第一列。

  • options.onlyBody

在行模式下将onlyBody设置为true时,用户只能在tbody中提升行。

  • API

下面是返回对象的API


tableDragger(document.querySelector('#event-table'), { mode: 'free', dragHandler: '.handle', onlyBody: true })
.on('drag', ()=> {
console.log('drag');
})
.on('drop', (from, to, el, mode)=> {
console.log(`drop ${el.nodeName} from ${from} ${mode} to ${to} ${mode}`);
})
.on('shadowMove', (from, to, el, mode)=> {
console.log(`move ${el.nodeName} from ${from} ${mode} to ${to} ${mode}`);
})
.on('out', (el, mode)=> {
console.log(`move out or drop ${el.nodeName} in mode ${mode}`);
});


总结

Table-draagger为我们节省了很多手动封装表格排序和拖拽功能的时间,当然目前很多第三方框架已经实现了类似的功能,这更适用于原生的html表格,你还可以通过一些手段记忆用户拖拽,这只是其中一种思路,Enjoy it!~

我们都知道普通的HTML自带的功能相对有限,很多复杂的交互式场景,如果手动去写功能的话会非常的复杂,而且可扩展性差,就拿HTML表格来说,对于初学者或者对于复杂的拖拽式交互编程不熟悉的话会很浪费时间,因此今天就介绍一个第三方的插件——Table-draagger,来轻松实现类似的功能。Table-draagger是用于构建可重排序的拖放表的极简主义纯Javascript库!



Github

https://github.com/sindu12jun/table-dragger


特征

Table-draagger因为其以下几个特征而让拖拽和排序的实现变得如此简单:

  • 非常容易配置
  • 能够同时对列或行进行排序
  • 排序时动画流畅
  • 没有臃肿的依赖
  • 提供触摸事件(意味着在触摸设备可以实现一些你想要的功能)


安装使用

  • 安装

可以在npm上获得它:

npm install table-dragger --save

或者引用压缩的js文件

<script src="../node_modules/table-dragger/dist/table-dragger.min.js"></script>

或者尝试开发中的不稳定版本

npm install table-dragger@next --save

  • 快速入门

请看以下代码:

import tableDragger from 'table-dragger'
tableDragger(el, options?)

<table id="table">
<thead>
<tr>
<th class='handle'>header1</th>
<th class='handle'>header2</th>
</tr>
</thead>
<tbody>
<tr>
<td>conten1</td>
<td>conten2</td>
</tr>
</tbody>
</table>

var el=document.getElementById('table');
var dragger=tableDragger(el, {
mode: 'row',
dragHandler: '.handle',
onlyBody: true,
});
dragger.on('drop',function(from, to){
console(from);
console(to);
});

你可以在不设置任何参数的情况下使用默认的拖拽和排序方式,当然以下是你可以配置的选项:

  • options.mode

1、将mode设置为column,用户拖动和排序表的列

2、将mode设置为row,用户拖动并排序表的行

3、设置mode为free,用户根据点击后鼠标移动的方向拖动行或列。注意,必须在自由模式下指定dragHandler。

  • options.dragHandler

dragHandler是表中的拖动句柄选择器默认情况下,在列模式下,dragHandler是表的第一行;在行模式下,则是第一列。

  • options.onlyBody

在行模式下将onlyBody设置为true时,用户只能在tbody中提升行。

  • API

下面是返回对象的API


tableDragger(document.querySelector('#event-table'), { mode: 'free', dragHandler: '.handle', onlyBody: true })
.on('drag', ()=> {
console.log('drag');
})
.on('drop', (from, to, el, mode)=> {
console.log(`drop ${el.nodeName} from ${from} ${mode} to ${to} ${mode}`);
})
.on('shadowMove', (from, to, el, mode)=> {
console.log(`move ${el.nodeName} from ${from} ${mode} to ${to} ${mode}`);
})
.on('out', (el, mode)=> {
console.log(`move out or drop ${el.nodeName} in mode ${mode}`);
});


总结

Table-draagger为我们节省了很多手动封装表格排序和拖拽功能的时间,当然目前很多第三方框架已经实现了类似的功能,这更适用于原生的html表格,你还可以通过一些手段记忆用户拖拽,这只是其中一种思路,Enjoy it!~