2015-08-20 2 views
1

Я пытаюсь сделать метод sort() самостоятельно с помощью функции.Как проверить, все ли номера заменены в массиве?

function arrange(arr) { 
       var arrangedList = []; 
       for (var i = 0; i < arr.length; i++) { 
           if (arr[i] > arr[i + 1]) { 
               var tmp = arr[i + 1]; 
               arr[i + 1] = arr[i] 
               arr[i] = tmp; 
           } 
           arrangedList.push(arr[i]); 
       } 
       return arrangedList; 
} 

Он меняет места, как я хотел, но проблема в том, что он меняет только один раз. если я вызываю функцию с [7,1,6,2] он будет работать так:

[1,7,6,2] 
[1,6,7,2] 
[1,6,2,7] 
  • и здесь он останавливается. он не будет проверять снова, если 6 больше 2, а затем поменяется. Как я могу это решить?

Вы можете увидеть мою скрипку here.

+0

Сразу я могу довольно смело сказать, что отсутствие вложенного цикла итератора в вашем первом цикле 'for' (или наоборот) является плохим знаком. Проверьте [алгоритмы сортировки пузырьков] (http://www.stoimen.com/blog/2010/07/09/friday-algorithms-javascript-bubble-sort/), если вы ищете решение. –

ответ

1

Что вы делаете, называется bubble sort. Этот сорт потенциально может занять столько итераций, сколько есть элементов в массиве - 1. Например, массив [2,3,4,5,1] выполнит четыре итерации.

Вы должны добавить второй цикл, который повторяет итерацию.

function arrange(arr) { 
    var arrangedList = arr; 
    for (var i = 0; i < arr.length; i++) { 
     for (var j = 0; j < arr.length; j++) { 
      if (arr[j] > arr[j + 1]) { 
       var tmp = arrangedList[j + 1]; 
       arrangedList[j + 1] = arrangedList[j]; 
       arrangedList[j] = tmp; 
      } 
     } 
    } 
    return arrangedList; 
} 

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

+0

Достаточно ли еще одного цикла? Потому что, как вы сказали, мы можем «знать, сколько там свопов». –

+0

Да. Дополнительный цикл for гарантирует, что мы будем перебирать n-1 раз через массив (где n - длина массива). Это максимум, который может потребоваться. –

1

Вот код от link Я упомянул в комментариях. Он реализует пузырьковой сортировки:

var a = [34, 203, 3, 746, 200, 984, 198, 764, 9]; 

function bubbleSort(a) 
{ 
    var swapped; 
    do { 
     swapped = false; 
     for (var i=0; i < a.length-1; i++) { 
      if (a[i] > a[i+1]) { 
       var temp = a[i]; 
       a[i] = a[i+1]; 
       a[i+1] = temp; 
       swapped = true; 
      } 
     } 
    } while (swapped); 
} 

bubbleSort(a); 
console.log(a);   //[3, 9, 34, 198, 200, 203, 746, 764, 984] 
0

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

function arrange(arr) { 

    for (var i = 0; i < arr.length; i++) { 
     for (var j = i; j < arr.length; j++) { 
      if (arr[j] > arr[j + 1]) { 
       var tmp = arr[j + 1]; 
       arr[j + 1] = arr[j]; 
       arr[j] = tmp; 
      } 

     } 
    } 
    return arr ; 
} 
1

вам придется использовать еще один цикл, как это:

function arrange(arr) { 
       for (var j = 0; j < arr.length; j++) { 
       for (var i = j; i < arr.length; i++) { 

           if (arr[i] > arr[i + 1]) { 
               var tmp = arr[i + 1]; 
               arr[i + 1] = arr[i] 
               arr[i] = tmp; 
           } 

       }} 
       return arr; 
} 

console.log(arrange([7, 1, 2, 6])); 
Смежные вопросы