2016-04-25 3 views
-1
var array = [5,3,4,1] 

for(var x = 0; x < array.length; x++){ 

    for(var y = array.length - 1; y >= x; y--){ 

     if(array[x] > array[y]){ 
      var temp = array[y]; 
      array[y] = array[x]; 
      array[x] = temp; 
    } 
    } 
} 
console.log(array); 

//Output : [1,3,4,5] 

Я понимаю, что петли предназначены для замены петель, по существу, заменяя два значения, если x больше y.Выполнение останавливается после первой итерации петли выхода

[1,3,4,5] - результат, когда x = 0, но Почему ничего не меняется после x = 1 и т. Д.? Не следует ли запустить вторичный цикл для своих итераций и продолжать менять значения до тех пор, пока первый цикл не достигнет array.length (4)?

EDIT: немного больше информации о том, где мой мыслительный процесс: Выходной сигнал [1,3,4,5] после первой итерации, но как насчет того, когда он выполняет итерацию до x = 1? В этот момент x [1] = 3, правильно? Оператор if терпит неудачу, когда y уменьшается с 5, до 4, до 3, но 3> 1, и поэтому я думаю, что выход будет изменен на [3,1,4,5]. В какой момент x итерации к x [2], который равен 4, и выход становится [4,3,1,5] и, наконец, x [3] = 5, где возможны дополнительные свопы

+1

Что заставляет вас думать, что он не работает полностью? (В этом конкретном примере это не так, потому что массив упорядочен на самой первой итерации ...) – Terminus

+0

Моя ошибка. Я знаю, что это работает полностью, я просто не понимаю, почему ничего не меняется после первой итерации. – 87born

+0

Ничего не меняется, потому что ничего не передается в выражении if. Прочитайте некоторые учебные пособия по программированию, это будет происходить на ранней стадии. – Terminus

ответ

-1

Не понимаю, что вы имели в виду, что процесс останавливается. Ниже приводится модифицированная версия кода

var array = [5,3,4,1] 
var count = 0, swap = 0; 
for(var x = 0; x < array.length; x++){ 
    for(var y = array.length - 1; y >= x; y--){ 
     count++; 
     if(array[x] > array[y]){ 
      swap++; 
      var temp = array[y]; 
      array[y] = array[x]; 
      array[x] = temp; 
    } 
    } 
} 
console.log('count', count, 'swap', swap,'array',array); 

счета 10 своп 1 массив [1, 3, 4, 5]

код представляет собой простой алгоритм замены сортировки от наименьшего к наибольшему. После первого свопа массив полностью сортируется и, следовательно, не происходит дальнейшего обмена. Цикл выполнялся 10 раз.

+0

Прошу прощения за то, что вы так плотно, но почему не происходит никаких дальнейших изменений? Выходной сигнал [1,3,4,5] после первой итерации, но как насчет того, когда он выполняет итерацию до x = 1? В этот момент x [1] = 3, правильно? Оператор if терпит неудачу, когда y уменьшается с 5, до 4, до 3, но 3> 1, и поэтому я думаю, что выход будет изменен на [3,1,4,5]. В этот момент x итерации к x [2], которая равна 4, а выход становится [4,3,1,5] и, наконец, x [3] = 5, где дальнейшие свопы невозможны. – 87born

+0

Когда x = 1, y = {3,2,1} (не {3,2,1,0}) и массив [y] = {5, 4, 3} (опять же, не {5,4,3 , 1}, так как цикл ломается, когда y

0
var array = [5,3,4,1] 
for(var x = 0; x < array.length; x++){ 
    for(var y = array.length - 1; y >= x; y--){ 
      console.log("condition="+(array[x] > array[y])); 
     if(array[x] > array[y]){ 
      var temp = array[y]; 
      array[y] = array[x]; 
      array[x] = temp; 
    } 
    } 
} 
console.log(array); 

Если вы посмотрите на выше, что вы пытаетесь сделать, это поменять местами значения на основе условия array[x] > array[y]. кода Это означает, что всякий раз, когда вы условие истинно, то только значения будут обменены. этот код будет содержать всего 10 итераций. Ваше состояние будет оцениваться 10 раз в этом конкретном коде. И из этих десяти случаев это будет справедливо только один раз. Отправляйте девять раз, пока он будет оценен как false. Таким образом, логика обмена не будет выполняться в течение этих девяти раз, поэтому вы получите результат как [1, 3, 4, 5], который, как вы упомянули после первой итерации. В приведенном выше коде я поставил console.log("condition="+(array[x] > array[y]));, это поможет вам понять, когда происходит условие: true и swapping.