Сортировка выбором не работает должным образом

Я сортирую свой массив с помощью сортировки выбором, но она не работает должным образом.
Он возвращает массив вроде 2, 3, 4, 17, 6, 8, 9, 11, 13.
Итак, я написал выборку алгоритм сортировки неверный? Это работает нормально в другом случае, но не здесь.

   <body>
  <button onclick="func()">Click</button>
</body>

<script>
  var arr = [4, 3, 11, 9, 18, 13, 6, 2];
var counter = 0;

function showarray() {
  for (var i = 0; i < arr.length; i++) {
    var divSort = document.createElement("div");
    divSort.style.width = 30 + "px";
    divSort.style.height = 30 + "px";
    divSort.style.background = "yellow";
    divSort.style.display = "inline-block";
    divSort.style.margin = "10px";
    divSort.id = arr[i];
    divSort.innerHTML = arr[i];
    document.body.appendChild(divSort);
  }
}
showarray();

function func() {
  for (var j = 0; j < arr.length-1; j++) {
    var min=j;
    for (var i = j+1; i < (arr.length); i++) {
      if (arr[min] > arr[i]) {
        min=i;

      }
    }

    swap(min, j);

}
}
  function swap(smaller, bigger) {
    var tmpBigger = arr[bigger];
    var tmpSmaller = arr[smaller];
    arr[bigger] = tmpSmaller
    arr[smaller] = tmpBigger;

    setTimeout(function() {
      $("#" + tmpSmaller).insertBefore("#" + tmpBigger);
    }, ++counter * 2000);
  }

person dummy    schedule 25.10.2015    source источник
comment
где твоя swap функция?   -  person Oleksandr T.    schedule 25.10.2015
comment
по какой причине вы просто не используете собственный метод сортировки массива?   -  person Rooster    schedule 25.10.2015
comment
@Alexander, это моя функция подкачки function swap (меньше, больше) { var tmpBigger = arr[bigger]; var tmpSmaller = arr[меньше]; arr[больше] = tmpSmaller arr[меньше] = tmpBigger;}   -  person dummy    schedule 25.10.2015
comment
@Rooster Мне нужен выбор, вставка или пузырьковая сортировка. Он работал с пузырем, но не с выбором   -  person dummy    schedule 25.10.2015
comment
@dummy кажется работает jsfiddle.net/bzvcz65v/1   -  person Oleksandr T.    schedule 25.10.2015
comment
@dummy, пожалуйста, обновите рассматриваемый код.   -  person    schedule 25.10.2015
comment
Подтверждаю, как сказал Александр, что пример дает правильный результат. В чем проблема? @ Хоган, я думаю, что эту строку не следует менять. Алгоритм ищет значения меньше, чем a[min], поэтому он может переместить указатель min на наименьшее из найденных.   -  person trincot    schedule 25.10.2015
comment
@trincot да, имеет смысл.   -  person Hogan    schedule 25.10.2015
comment
Да, это работает в jsfiddle, но не на странице. Я редактирую свой вопрос и добавляю весь код @trincot   -  person dummy    schedule 25.10.2015
comment
@dummy, массив сортируется правильно, а div - нет. Вы просто перемещаете меньшее значение перед более высоким значением, тогда как ваш алгоритм фактически меняет значения местами (перемещая оба элемента).   -  person MinusFour    schedule 25.10.2015
comment
@MinusFour, тогда как мне правильно поменять местами div?   -  person dummy    schedule 25.10.2015


Ответы (2)


просто отсортируйте их как числовые:

var arr = [4, 3, 17, 11, 9, 8, 13, 6, 2];
arr.sort(function(a, b) {
  return a - b;
});
alert(arr);
person Mark Schultheiss    schedule 25.10.2015

Эта функция подкачки будет работать с братьями и сестрами:

function swap(ind1, ind2) {
    var valueOne = arr[ind1];
    var valueTwo = arr[ind2];
    arr[ind2] = valueOne;
    arr[ind1] = valueTwo;

    setTimeout(function () {
        elementSwap($('#' + valueOne), $('#' + valueTwo));
    }, ++counter * 2000);
}

function elementSwap(jq1, jq2) {
    var tmp;
    if (jq1.prev().length > 0) {
        tmp = jq1.prev();
        jq1.insertBefore(jq2);
        jq2.insertAfter(tmp);
    } else {
        tmp = jq1.next();
        jq1.insertBefore(jq2);
        jq2.insertBefore(tmp);
    }
}

Кроме того, меньшее и большее различие в этом случае не имеет значения.

Я также предлагаю делать обмен только в том случае, если min отличается от j:

if (min !== j) swap(min, j);

var arr = [4, 3, 17, 11, 9, 8, 13, 6, 2];
var counter = 0;

function showarray() {
    for (var i = 0; i < arr.length; i++) {
        var divSort = document.createElement("div");
        divSort.style.width = 30 + "px";
        divSort.style.height = 30 + "px";
        divSort.style.background = "yellow";
        divSort.style.display = "inline-block";
        divSort.style.margin = "10px";
        divSort.id = arr[i];
        divSort.innerHTML = arr[i];
        document.body.appendChild(divSort);
    }
}
showarray();

function func() {
    for (var j = 0; j < arr.length - 1; j++) {
        var min = j;
        for (var i = j + 1; i < (arr.length); i++) {
            if (arr[min] > arr[i]) {
                min = i;
            }
        }
        if (min !== j) swap(min, j);

    }
}

function swap(ind1, ind2) {
    var valueOne = arr[ind1];
    var valueTwo = arr[ind2];
    arr[ind2] = valueOne;
    arr[ind1] = valueTwo;

    setTimeout(function () {
        elementSwap($('#' + valueOne), $('#' + valueTwo));
    }, ++counter * 2000);
}

function elementSwap(jq1, jq2) {
    var tmp;
    if (jq1.prev().length > 0) {
        tmp = jq1.prev();
        jq1.insertBefore(jq2);
        jq2.insertAfter(tmp);
    } else {
        tmp = jq1.next();
        jq1.insertBefore(jq2);
        jq2.insertBefore(tmp);
    }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<button onclick="func()">Click</button>

person MinusFour    schedule 25.10.2015