[JS] Проблем със задача 5 от Arrays


3

Задача:

Sorting an array means to arrange its elements in increasing order. Write a script to sort an array. Use the "selection sort" algorithm: Find the smallest element, move it at the first position, find the smallest from the rest, move it at the second position, etc.

Hint: Use a second array
 
Видях няколко решения и се ориентирах в задачата, но просто не мога да си обясня защо не иска да тръгне така, както аз съм го направил.
 
Ето го и кода: http://jsbin.com/epixUTo/5/watch?html,js,output



Отговори



3

Колега, поразгледах кода и мисля, че грешката ти е в това че във втория цикъл трябва брояча да тръгне от j+1. Пооправих го и започна да работи добре. Ето с това мога да ти помогна :)

function check() {
 
  var answer = document.getElementById("answer");
  var chars = document.getElementById("chars").value;
  var arr = chars.split(" ");
  
  var n = arr.length;
  var outText = "The chars in increasing order are as follows: ";
  
  var i,j;
  var min;
  var tmp;
 
  for (j = 0; j < n-1; j++) {
      min = j;
      for ( i = j+1; i < n; i++) { // тук започваш от j+1 !
        
          if (arr[i] < arr[min]) {
            min = i;
           }
      }
   if ( min != j ) {
      
      //тук сменяваш стойностите.
 
       tmp = arr[j];
       arr[j] = arr[min];
       arr[min] = tmp;
   }
  }
  
  answer.innerHTML = outText + "<div>" + arr.join(',') + "</div>";
 
}

от CaptCortez (1242 точки)


0
Длъжник съм ти ;)


0
:))))))))))))))) за нищо :)

от CaptCortez (1242 точки)


2
Може и така, идеята е същата: for (int row = 0; row < array.GetLength(0); row++) { for (int next = row + 1; next < array.GetLength(0); next++) { if (array[row] > array[next]) { int tempArrayRow = array[row]; array[row] = array[next]; array[next] = tempArrayRow; } } }

от Opteronic (1153 точки)


1

Най - лесно и бързо (може и по бързо) се сортира масов от числа по този начин:

function compare(value1, value2) {
    if (value1 < value2) {
              return -1;
       } else if (value1 > value2) {
              return 1;
       } else {
              return 0;
       }
}

arr.sort(compare)

Но не се научаваш на selection sort по този начин, нито пък на какъвто и да е sort.

P.S.

compare функцията се изисква защото в противен случай масива се сортира лексикографски.


от nikolap (555 точки)


0
Така я бях направил след като не ми се получи по зададения в задачата начин ;) bubble method или както там го водят на някои места


0
Ами това не е bubble sort. Това е sort метода, който е вграден в обекта Array на Javascript. Не съм сигурен точно по какъв начин сортира. Ако искаш да ги сортира в обратен ред можеш да промениш compare функцията или след като си го сортирал с тази функция да му дадеш reverse(). Но най-добре се научи как се сортира без Array.sort()

от nikolap (555 точки)


1

 Колеги, понеже не е споменато в условието, САМО за сортиране на числа ли става въпрос? С моя метод ако вкарам char или string задачата не бачка. Ето кодът:

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

        smallest = Number.MAX_VALUE;
 
        for (j = i; j < array.length; j++) {
            
            if (parseInt(array[j]) < parseInt(smallest)) {
                smallest = array[j];
                temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }
    }

Опитах се да го изпълня точно като по условие, но без втори масив. На първото завъртане на i вземам най малкото, на следващото завъртане на i - следващото най-малко и така.

 Някой може ли да обясни с две думи как работи сортирането с функции, които връщата 1, -1 или 0?


от ivan.mihov1 (4988 точки)


0
При arrays за готови функции който връщат или намерената стойност или -1 се сещам за indexOf и lastIndexOf, иначе всичко останало е както е зададено да се извърши в кода като върната стойност, тук в случая ако искаш да връщаш и char и string(което в JS е едно и също), можеш да не задаваш на smallest да е тип (Number), и долу да не парсваш array-я, а при първия цикъл да зададеш например: var smallest=array[i]; Между другото ако така задаваш променливи, smallest=, се водят глобални, и е добре да внимаваш при тази инициализация. re: ако се налага да работи за стрингове където подрежда според first letter, ще ти трябват допълнителни функции, array.filter или function(a,b) {a-b}, нещо като lambda expression при C# ако се сещаш.

от tsonko_genov (708 точки)

0
Така написан кодът няма как да работи за стрингове, след като винаги, когато правиш сравнение парсваш към int. Както е казал колегата като smallest по-добре взимай array[i]. Така написан кодът ти не работи правилно, защото ти постоянно променяш масива, в който търсиш докато все още търсиш в него. Промяната трябва да стане след като е приключило търсенето. В if-a трябва единствено да имаш промяната на smallest и да запазиш позицията на j. След това след като приключи втория for цикъл тогава размени местата на обектите в масива.

от Vazzzz (1380 точки)



1
Аз измислих следното решение -
http://pastebin.com/Sc8jLDKq
, но при мен проблема е че ако има две еднакви цифри в масива, едната я изрязвам, и не знам как да го оправя :(

от dsterev (20 точки)


0
Ами защото ползваш .splice, виж ако искаш видеото за Масиви на Ивайло от вчера - има пояснение защо работи така, имаш вариант да направиш задачата и с for in цикъл.

от tsonko_genov (708 точки)

0
В случая използвам .splice за работен масив, който ми търси индекса на всяко число, проблема се появява когат пушвам числата в новия масив.

от dsterev (20 точки)