Сортировка вставок справа налево с помощью JavaScript - PullRequest
0 голосов
/ 07 февраля 2019

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

function reverseInsertionSort(arr) { 
for(var i = arr.length -1; i >0; i--) 
var val = arr[i];
    var j;
    for(j = i; j > 0 && arr[j-1] < val; j--) {
        arr[j-1] = arr[j]; }
     va=arr[j]; }
function insertionSort(arr) { 
    for(var i = 1; i < arr.length; i++) { 
        var val = arr[i];
        var j;
        for(j = i; j > 0 && arr[j-1] > val; j--) {
            arr[j] = arr[j-1]; }
        arr[j] = val; }
    }
            arr[j] = val;
        }
    }
var length = Math.floor(Math.random()*100)+1;
var arr = new Array();
for(let i = 0; i < length; i++) {
    arr.push(Math.floor(Math.random()*10000)+1);
}
var arr2= arr.slice();

reverseInsertionSort(arr2);
console.log(arr2)

Не сортируется, и вывод заканчивается неопределенным.arr используется для проверки вставки сортировать веселье с удовольствием принять конструктивную критику.

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Это будет работать.

function reverseInsertionSort(arr) { 

    for(var i = arr.length-2; i>=0; i--) {

        var value = arr[i];
        var j;

        for(j = i; ((j < arr.length) && (arr[j+1] > value)); j++){ 
            arr[j] = arr[j+1]; 
        } 
        arr[j] = value;
    }
    return arr;
}

//test
var inputArray = [3,2,4,5,1,10,23];
var resultArray = reverseInsertionSort(inputArray);
console.log(resultArray); //[23, 10, 5, 4, 3, 2, 1]
0 голосов
/ 07 февраля 2019

Вы должны начать внешний цикл с последнего элемента, т.е.LEN-1.Неопределенный член массива создается из-за внешнего цикла, начиная с arr.length.Попробуйте это:

function insSort(arr){
  for(var i=arr.length-1;i>=0;i--){
    key=arr[i];
    j=i+1;
    while(j<arr.length&&arr[j]<=key){
      arr[j-1]=arr[j];
      j++;
    }
    arr[j-1]=key;
  }
}
var length = Math.floor(Math.random()*100)+1;
var arr = new Array();
for(let i = 0; i < length; i++) {
    arr.push(Math.floor(Math.random()*10000)+1);
}
console.log(arr);
insSort(arr);
console.log(arr);
...