我可以对订购一组n号码程序做些什么改进?

时间:2017-07-07 14:46:32

标签: javascript

我正在学习如何使用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>");

2 个答案:

答案 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()