今天实现了一个新的排列算法,原理如下:
为方便说明,要进行排序的数组假设是[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>