【问题标题】:QuickSort Lomuto Algorithm快速排序 Lomuto 算法
【发布时间】:2018-09-07 02:47:22
【问题描述】:

我正在运行 Lomuto 快速排序算法的实现,基于:https://en.wikipedia.org/wiki/Quicksort

为了测试它,我尝试了几个数组来查看排序算法是否正确实现。

测试用例:

Array # 1: [1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92] 
Array # 2: [11,8,14,3,6,2,7]

根据我对 Lomuto 算法的理解,这是来自 wikipedia 的代码:

function quickSort(array) {
  // change code below this line
  var n = array.length;
  var low, hii;
  low = 0;
  hii = n - 1;
  // console.log(sub_qs(array, low, hii));
  array = sub_qs(array, low, hii);
  console.log(array);

  /***** Lomuto Algorithm Scheme *****/
  function sub_qs(arr, lo, hi) {
    if (lo < hi) {
      var p = partition(arr, lo, hi);
      sub_qs(arr, lo, p - 1);
      sub_qs(arr, p + 1, hi)
    }
    return arr;
  }

  function partition(a, l, h) {
    var pivot = a[h];
    var i = l;
    for (var j = l; j < h - 1; j++) {
      if (a[j] < pivot) {
        var temp = a[i];
        a[i] = a[j];
        a[j] = temp;
        i++;
      }
      var temp_1 = a[i];
      a[i] = a[h];
      a[h] = temp_1;
    }
    return i;
  }
  /***** Lomuto Algorithm Scheme *****/

  // change code above this line
  return array;
}

运行程序后,我的结果是:

Results # 1: [1, 1, 8, 2, 32, 2, 63, 43, 55, 43, 123, 4, 92, 345, 123, 234, 5643]
Results # 2: [3, 6, 8, 7, 11, 2, 14]

有些不对劲。我可能做错了什么?

【问题讨论】:

    标签: javascript quicksort


    【解决方案1】:

    在您的分区中,第二个交换应位于for 循环之外,for 循环需要包含h - 1,因此请使用for (var j = l; j &lt; h; j++) 或for (var j = l; j &lt;= h -1; j++):

    function quickSort(array) {
      // change code below this line
      var n = array.length;
      var low, hii;
      low = 0;
      hii = n - 1;
      array = sub_qs(array, low, hii);
    
      /***** Lomuto Algorithm Scheme *****/
      function sub_qs(arr, lo, hi) {
        if (lo < hi) {
          var p = partition(arr, lo, hi);
          sub_qs(arr, lo, p - 1);
          sub_qs(arr, p + 1, hi)
        }
        return arr;
      }
    
      function partition(a, l, h) {
        var pivot = a[h];
        var i = l;
        for (var j = l; j < h; j++) { // << need to be  j < h not h - 1
          if (a[j] < pivot) {
            var temp = a[i];
            a[i] = a[j];
            a[j] = temp;
            i++;
          }
        }
        // this swap should be outside the above for loop <---
        var temp_1 = a[i];
        a[i] = a[h];
        a[h] = temp_1;
    
        return i;
      }
      /***** Lomuto Algorithm Scheme *****/
    
      // change code above this line
      return array;
    }
    
    let array1 = [1, 4, 2, 8, 345, 123, 43, 32, 5643, 63, 123, 43, 2, 55, 1, 234, 92]
    let array2 = [11, 8, 14, 3, 6, 2, 7]
    console.log(quickSort(array1).join(','))
    console.log(quickSort(array2).join(','))

    【讨论】:

    • 谢谢!我正在寻找更复杂的实现来解决这个问题(重复元素等)。毕竟我在伪代码上误读了几件事。
    • 很高兴它对@JMags1632 有所帮助——我看到这个问题的唯一原因是因为我以前做过完全相同的问题。很难得到所有的细节。
    猜你喜欢
    • 1970-01-01
    • 2021-06-12
    • 1970-01-01
    • 1970-01-01
    • 2019-10-18
    • 2016-11-24
    • 2018-05-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多