打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
OU

最简单的全排列算法

, ,

刚开始接触排列组合算法的时候,觉得很复杂,越想越难,有了想法,程序写完运行结果还总不正确。一旦成功,发现,原来解决的方法竟然如此简单!

今天实现了一个新的排列算法,原理如下:

为方便说明,要进行排序的数组假设是[0,1,2]

先取数组的第一个元素,作成数组,结果是
[0]

接下来取数组的第二个元素,按顺序插入以上数组的"空位",结果是
[0,1]
[1,0]


继续取数组的第三个元素,按顺序插入以上每一数组的"空位",结果是
[2,0,1]
[0,2,1]
[0,1,2]
[2,1,0]
[1,2,0]
[1,0,2]


这,不就是原数组的全排列?

怎么样,简单吧?
还有比这个更简单的排列算法吗?如果有,请告知,多谢!

源代码如下:
<script type="text/javascript">/** * 数组克隆(复制) * @return 数组的拷贝 */Array.prototype.clone = function () {    return this.concat();};/** * 插入数组元素(值)到指定位置 * @param iIndex 指定位置(索引) * @param vItem 欲插入的元素(值) */Array.prototype.insertAt = function (iIndex, vItem) {    this.splice(iIndex, 0, vItem);    return this;};/** * 插入递归全排列算法 */function getAllOrderByInsert(aData, aOrder) {    if(!aOrder) {        aOrder = [[aData[0]]];    }    var iLen = aOrder[0].length;    if(iLen == aData.length) {        return aOrder;    }    var aNewOrder = [];    var vInsert = aData[iLen];    for(var i = 0; i < aOrder.length; i++) {        var aOld = aOrder[i];        for(var j = 0; j <= aOrder[i].length; j++) {            var aNew = aOld.clone().insertAt(j, vInsert);            aNewOrder.push(aNew);        }    }    return getAllOrderByInsert(aData, aNewOrder);}//测试var aData = [0,1,2,3,4];document.write("数组[" + aData.join(" ") + "]的全排列:"); var aOut = getAllOrderByInsert(aData);for(var i=0; i<aOut.length; i++) {    document.write(aOut[i].join(" ") + ""); }</script>
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
javascript 数组对象根据指定属性排序
Delphi编程:用流来读取TXT文件中的数据
Python | 8种必须知道的排序算法
选择排序
delphi产生不重复随机数的算法
原创的基于Ajax的通用(组合)查询 - 冰戈 - 博客园
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服