首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QuickSort Lomuto算法

QuickSort Lomuto算法
EN

Stack Overflow用户
提问于 2018-09-07 02:32:11
回答 1查看 275关注 0票数 0

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

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

测试用例:

代码语言:javascript
复制
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算法的理解,它遵循了一个tee:

代码语言:javascript
复制
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;
}

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

代码语言:javascript
复制
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]

有些地方不对劲。我能做错什么呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-09-07 02:47:23

在您的分区中,第二个交换应该在for循环之外,并且for循环需要包含h - 1,因此可以使用for (var j = l; j < h; j++)for (var j = l; j <= h -1; j++)

代码语言:javascript
复制
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(','))

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52210217

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档