Почему этот цикл while не останавливается?

По какой-то причине я не могу заставить этот код правильно сортировать. Я заменяю неупорядоченные номера, чтобы составить упорядоченный список.

 var unsortedArray = new Array(1,2,5,4);

    var sortedArray = unsortedArray;
    var tempValue = 0;

    function isSorted(array)
    {
        for (i = 0; i < array.length; i++)
        {
            if (array[i] > array[i+1])
            {
                return false;
            }
        }
        return true;
    }

    function sort(array)
    {



        while (isSorted(array) == false)
        {
            for (i = 0; i < length; i++)
            {
                var tempValue = array[i];

                array[i] = array[i+1];
                array[i+1] = tempValue;
            }
        }
    }

    sort(sortedArray);

    document.write(sortedArray);

Здесь предполагается, что цикл while останавливается, когда массив отсортирован, но этого никогда не происходит.


person Mineohmight    schedule 28.04.2016    source источник
comment
Гипотеза: массив не отсортирован должным образом.   -  person user2864740    schedule 28.04.2016
comment
for (i = 0; i < length; i++) Где вы берете length, я нигде не вижу, чтобы он был определен, поэтому ваш цикл for, который должен сортировать, не запускается или будет использовать глобальное свойство length и будет использовать это число вместо того, что вы имели в виду.   -  person Patrick Evans    schedule 28.04.2016
comment
Ваша сортировка не сравнивает элементы, чтобы увидеть, нужно ли их менять местами. Он просто всегда меняет их местами вне зависимости от того, нужно им это или нет. Таким образом, массив никогда не переходит в отсортированное состояние.   -  person RJM    schedule 28.04.2016


Ответы (3)



Попробуй это,

Элементы будут меняться местами, только если a[n] меньше a[n-1].

while (isSorted(array) == false)
{
    for (i = 0; i < length-1; i++)
    {
      if(array[i]>array[i+1]){
             var tempValue = array[i];
             array[i] = array[i+1];
             array[i+1] = tempValue;
       }
}

Он также изменяет цикл for на for(var i = 0; i < length - 1; i++).

В противном случае в конце массива вы получите доступ к array[length], который будет неопределенным (к счастью, это не повлияет на сортировку, но в любом случае лучше быть правильным).

person Kajal    schedule 28.04.2016

for (i = 0; i < length; i++)
    {
        var tempValue = array[i];

        array[i] = array[i+1];
        array[i+1] = tempValue;
    }

здесь вы никогда не проверяете, отсортированы ли соседние значения..... или левое значение больше правого значения.... (хотя я считаю длину в цикле for функции сортировки длиной массива)

Просмотрите простой алгоритм пузырьковой сортировки, а затем попробуйте.....

обратитесь к этому алгоритму на C здесь

person Avijeet Ghosh    schedule 28.04.2016