一、总体介绍
利用JS实现在用户输入一个自定义数组,例如1,4,5,23,2,17,24,1000000.然后按照中间高两边低进行排序,最后的结果是1,4,5,23,1000000,24,17,2;算法越准确越好,注意左右两翼数据的平衡性*
二、HTML部分(只为测试、不需CSS)
<input type="text" id="put"/> //这里默认使用“,”将数据隔开,而且没做验证,格式需要输入正确
<input type="button" id="btn" value="排序"/>
三、JS部分(重要部分)
var btn = document.getElementById('btn');
btn.onclick = function (){
var put = document.getElementById('put').value;//获取用户输入的值
var str = put.split(",");//用于存放用户输入的值,这里将用户输入的数据按照“,”进行分割成数组
var arr = str.sort(compare);//由小到大排序
var result = [];//最终输出结果
result.push(arr[0]);//排序之后直接将第1、2位的数据放入最终结果之中
result.push(arr[1]);
var l = 1;//定义该从何处插入数组值
var lNum = parseInt(arr[0]),rNum = parseInt(arr[1]);//最终结果的左右侧的数值之和
var boor = false;//这个定义是用于对循环进行限制,从第三个数据开始,每两个进行比对,第一个比对后,第二个就不用再进行循环了!
for (var i = 2 ; i < arr.length; i++) {//两翼数据平衡第一次
if((arr.length)%2 == 0){//判断输入的数组长度是否为偶数
if(boor){
boor = false;
continue;
}else{
boor = true;
result.splice(l,0,arr[i+1]);
l ++;
result.splice(l,0,arr[i]);
}
}else{
if(i == arr.length-1){
result.splice(l,0,arr[i]);
}else if(boor){
boor = false;
continue;
}else{
boor = true;
result.splice(l,0,arr[i+1]);
l ++;
result.splice(l,0,arr[i]);
}
}
}
//两翼数据平衡处理第二次
var lIndex = 0;//初始result左部索引号
var rIndex = result.length-1;//初始result右部索引号
var lSum = 0,rSum = 0;//存放左右两端数据的和
for (var i = 0; i < Math.floor(result.length/2);i++) {//需要求和的次数为数组长度的一半,这里需要注意当数组长度为偶数时,默认左边少进行一次求和,保证最大数在中间部分
if((result.length)%2 == 0){
rSum += parseInt(result[rIndex]);
rIndex --;
if(i < (result.length/2)-1){
lSum += parseInt(result[lIndex]);
lIndex ++;
}
}else{
lSum += parseInt(result[lIndex]);
lIndex ++;
rSum += parseInt(result[rIndex]);
rIndex --;
}
}
if(lSum < rSum-3){//两翼数据平衡处理第三次,根据第二次结果来判断执行,减去3的目的是限制两边之差,若小于3则不用进行比对,直接输出便可
var gap = Math.abs(lSum - rSum)-3;//数值差的绝对值
for (var i = gap; i > 0; i--) {
for (var j = Math.floor((result.length/2)) ; j < result.length; j++ ) {
if(i == parseInt(result[j])){
var a = result.slice(j,j+1);
result.splice(j,1);
if(j == result.length){
result.splice(1,0,a);
}else{
result.splice(result.length-j,0,a);
}
alert(result);
return;//满足条件,不用再进行数据交换了,结束整个循环;
}
}
}
}else{
alert(result);
}
}
//排序函数(由小到大)
function compare(n1,n2){
return n1 - n2;
}
四、结果展示
/===========================================================/
_以上程序为作者个人想法,若有不足之处,欢迎留言指导_
/===========================================================/