我正在学习如何使用javascript编程,我制作了第一个程序"做了一些事情"。我没有为算法的任何部分寻求帮助,只是在某些部分找到我想要使用的函数的名称。这个算法似乎有效,但是当你有一个很大的数字列表时,它似乎没有完成,比如10个或更多。你怎么看待它?完全没有效率吗?
var totNum = Number(prompt("How many numbers you want to compare"));
var unordNum = new Array(totNum);
var ordNum = new Array();
for( var i=1 ; i<= totNum; i++){
unordNum[i] = Number(prompt("Write a new number","0"));
}
while(ordNum.length < totNum){ // I will repeat this process until I order all numbers
for(var i=1; i <=totNum; i++){ //choose a number, lets call it X
if(!(ordNum.indexOf(unordNum[i]) >=0)){ //if it is already ordered, skip it
var z = 0;
for(var j=1; j<=totNum; j++){ //I will compare X against all the others numbers, except
if(!(ordNum.indexOf(unordNum[j]) >= 0)){ //the ones that are already ordered
if( unordNum[i] >= unordNum[j]){ //if X is bigger than a number,
z++; // add 1 to z
}
if(z==totNum-ordNum.length){ // this means X is bigger or equal than all the other numbers
ordNum.push(unordNum[i]); //so write X in the first empty space of the ordered list
}
}
}
}
}
}
document.write(ordNum + "<br>");
答案 0 :(得分:1)
您可以使用ordNum.indexOf(unordNum[j])
来查找数字是否已经排序。如果出现重复,这将导致无限循环。其次,你并没有真正排序,你会为第一次比较成功推出一个数字。
以下是您的排序有点类似的逻辑。
var totNum = Number(prompt("How many numbers you want to compare"));
var unordNum = new Array(totNum);
var ordNum = new Array();
for( var i=0 ; i< totNum; i++){
unordNum[i] = Number(prompt("Write a new number","0"));
}
for(var i=0; i <totNum; i++){
if(unordNum[i] == undefined) continue; //jump to the next unsorted number
var smallest = unordNum[i]; //initialize smallest to be the first unsorted number
var index = i; //initialize marker index to be set as undefined at last for the number being moved to the sorted array
for(var j=0; j<totNum; j++){ //Comparison loop to find the smallest
if(unordNum[j] != undefined){
smallest = unordNum[j]<smallest ? unordNum[j] : smallest; //Swap if j th number is smaller
index = smallest == unordNum[j] ? j : index; // update index if swapping done
}
}
unordNum[index] = undefined;//mark the number moved
ordNum.push(smallest); // add smallest number to sorted array
i=0; //set outer loop to start from 0 again
}
document.write(ordNum + "<br>");
这可以通过将剩余数组中的最小数字复制到新数组中来进行排序。我没有像你一样使用ordNum.indexOf(unordNum[j])
,而是将已排序的元素标记为undefined
。在您的情况下无法对重复项进行排序。这将使新的排序数组小于输入数组,因此是无限循环。另一件事,你为什么用1作为起始指数?默认索引也从Javascript中的0开始。
有更好的排序算法,但也许这不是你想要的。
答案 1 :(得分:-2)
数组中有数字后,您可以使用array.sort()