代码之家  ›  专栏  ›  技术社区  ›  William Machado

插入用javascript从右到左排序

  •  -1
  • William Machado  · 技术社区  · 5 年前

    我试图编写一个从右到左的插入排序函数。 不是按降序排列。我只是不明白为什么这段代码不能正确地对数字排序。

    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 回复  |  直到 5 年前
        1
  •  1
  •   Sankha Karunasekara    5 年前

    这行得通。

    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]
    
        2
  •  1
  •   SSG    5 年前

    您应该从最后一个元素(即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);