2014-01-18 4 views
0

Эта страница падает на ходу: Почему эта сортировка сортировщика списка?

<head> 
<script> 
    var list = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1]; 
    var listOrdered = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]; 
    var loopCount = 0; 

    while (list !== listOrdered) { 
     if (list[loopCount] > list[loopCount + 1]) { 
      var lower = list[loopCount + 1]; 
      var higher = list[loopCount]; 
      list[loopCount] = lower; 
      list[loopCount + 1] = higher; 
     } 
     if (loopCount === 19) { 
      loopCount = 0; 
     } else { 
      loopCount = loopCount + 1; 
     } 
    } 
</script> 
</head> 

</html> 

Что я мог сделать, чтобы стабилизировать его?

Насколько я знаю, логика правильна, как я предполагаю. Это чисто рекреационные эксперименты. не

После дальнейшего развития, проблема сравнения больше не существует:

<!doctype html> 
<html> 
<head> 
    <script> 
    var sweeps = 0; 
    var swaps = 0; 
    var list = [25, 21, 4, 23, 32, 2, 40, 8, 27, 9, 29, 33, 31, 14, 12, 16, 35, 18, 37, 20, 39, 19, 38, 17, 36, 15, 34, 13, 6, 11, 30, 10, 28, 7, 26, 5, 1, 3, 22, 24]; 
    var loop = 0; 
    var swapped = 0; 
    var ordered = 0; 

    while (ordered !== 1) { 
     if (list[loop] > list[loop + 1]) { 
      var lower = list[loop + 1]; 
      var higher = list[loop]; 
      list[loop] = lower; 
      list[loop + 1] = higher; 
      swapped = 1; 
      swaps = swaps + 1; 
     } 
     if (loop === list.length - 1) { 
      if (swapped === 0) { 
       ordered = 1; 
      } 
      swapped = 0; 
      loop = 0; 
     } else { 
      loop = loop + 1; 
     } 
     sweeps = sweeps + 1; 
    } 
    alert("list: " + list); 
    alert("Sweeps: " + sweeps + ", Swaps: " + swaps); 
</script> 

(Например, как «булочка монстр» предлагает)

ответ

1

Поскольку объекты массива никогда не будет таким же, объект, даже если их содержимое заканчивается тем же (JavaScript не сравнивает значения при использовании операторов сравнения на объектах (включая массивы), но являются ли они идентичными объектами). Вы можете сериализовать их оба в строку и сравнить строки, однако, для быстрого и грязного сравнения, который вписывается в ваш подход:

<head> 
<script> 
var list = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1]; 
var listOrdered = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]; 
var loopCount = 0; 

while (JSON.stringify(list) !== JSON.stringify(listOrdered)) { 
    if (list[loopCount] > list[loopCount + 1]) { 
     var lower = list[loopCount + 1]; 
     var higher = list[loopCount]; 
     list[loopCount] = lower; 
     list[loopCount + 1] = higher; 
    } 
    if (loopCount === 19) { 
     loopCount = 0; 
    } else { 
     loopCount = loopCount + 1; 
    } 
} 
alert(JSON.stringify(list)) // [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20] 
</script></head></html> 

JSON.stringify не доступен по умолчанию в старых браузерах, так что если вам нужно для поддержки старых браузеров вы можете использовать https://github.com/douglascrockford/JSON-js/blob/master/json2.js

+0

спасибо, что позволило проверить. Я не знаком с JSON. – Ware

1

Вместо того, чтобы делать сравнение, я бы просто использовал флаг, чтобы указать, нужно ли менять значения во время итерации. Если это так, сбросьте счетчик на 0 и сбросьте флаг. Если нет, все готово.

var list = [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 19, 17, 15, 13, 11, 9, 7, 5, 3, 1]; 
var loopCount = 0; 
var swapped; 

while (true) { 
    if (list[loopCount] > list[loopCount + 1]) { 
     var lower = list[loopCount + 1]; 
     var higher = list[loopCount]; 
     list[loopCount] = lower; 
     list[loopCount + 1] = higher; 
     swapped = true;  // Set the flag indicating we swapped a pair of values. 
    } 
    if (loopCount === 19) { // At the end of a full iteration... 
     if (swapped) {  // check to see if we had occasion to swap.. 
      swapped = false;// and if so, reset the flag, and start again.. 
      loopCount = 0; 
     } else 
      break; // or if not, we're done sorting. 
    } else { 
     loopCount = loopCount + 1; 
    } 
} 

Это будет намного быстрее, чем любое сравнение массива.

+0

Мне было рекомендовано избегать while (true) циклов для семантики. насколько это важно? – Ware

+0

@Wetware: Это чисто вопрос предпочтения. Другие будут предлагать всегда положить всю логику в блок. В конечном счете, поскольку вы переустанавливаете 'loopCount' на' 0' в цикле, вы всегда рискуете бесконечным циклом, если логика неверна. Ваш 'ordered! = 1' будет работать очень хорошо, хотя я бы склонен использовать логическое, но это тоже вопрос предпочтения. :-) –

Смежные вопросы