使用一个没有sort函数的循环对随机数组进行排序

时间:2018-05-11 20:04:24

标签: javascript

我可以使用一个循环对随机数组进行排序而不使用sort函数???但是我可以使用一个for循环吗?我怎样才能做到这一点 ? 这里我使用嵌套循环

Vue.use()

3 个答案:

答案 0 :(得分:1)

你可以只用一个循环进行mergesort:

function mergeSort(arr) {
  if(arr.length < 2) return arr

  const a = mergeSort(arr.slice(0, arr.length / 2)),
             b = mergeSort(arr.slice(arr.length / 2));

 const result = [];

  while(a.length && b.length)
    result.push((a[0] > b[0] ? a : b).shift());

  return result.concat(a, b);
}

但正如上面的评论中所述,这不会比具有多个循环的方法更快,可能更慢。

答案 1 :(得分:0)

这是一个显示各种排序算法及其复杂性的图表:

enter image description here

单次通过一个没有递归或嵌套的循环是O(n),所以不,不是在最坏的情况下。还有其他排序技术,可以使用单个循环对数组进行排序,如Jonas W.所示,但它们的时间复杂度不一定与Quicksort的旧.sort()一样好。

答案 2 :(得分:0)

如果您有兴趣,可以使用这种方式实现自己的快速排序。

但请注意,使用默认的js排序会比您自己可以做的任何实现(最有可能)快得多,因为该排序已经过优化,可以尽快运行。这只是通用教科书quicksort的实现。

const quicksort = arr => {

  const _partition = (arr, begin, end) => {
    let pivot = begin;
    for (let i = begin; i <= end; i++) {
      if (arr[i] < arr[begin]) {
        pivot++;
        [arr[pivot], arr[i]] = [arr[i], arr[pivot]];
      }
    }
    [arr[begin], arr[pivot]] = [arr[pivot], arr[begin]];
    return pivot;
  }

  const _quicksort = (arr, begin, end) => {
    if (begin < end) {
      const pivot = _partition(arr, begin, end);
      _quicksort(arr, begin, pivot - 1);
      _quicksort(arr, pivot + 1, end);
    }
  }

  _quicksort(arr, 0, arr.length);
}

const arr = [10, 18, 4, 5, 9, 6, 16, 12];
quicksort(arr);
console.log(arr);

你可以通过随机选择pivot这样的选项来加快速度(在某些情况下)。

const quicksort = arr => {

  const _partition = (arr, begin, end) => {
    let pivot = begin;
    for (let i = begin; i <= end; i++) {
      if (arr[i] < arr[begin]) {
        pivot++;
        [arr[pivot], arr[i]] = [arr[i], arr[pivot]];
      }
    }
    [arr[begin], arr[pivot]] = [arr[pivot], arr[begin]];
    return pivot;
  }

  const _randomizedPartition = (arr, begin, end) => {
    const index = Math.floor(Math.random() * (end-begin)) + begin;
    [arr[begin], arr[index]] = [arr[index], arr[begin]];
    return _partition(arr, begin, end);
  }

  const _quicksort = (arr, begin, end) => {
    if (begin < end) {
      const pivot = _randomizedPartition(arr, begin, end);
      _quicksort(arr, begin, pivot - 1);
      _quicksort(arr, pivot + 1, end);
    }
  }

  _quicksort(arr, 0, arr.length);
}

const arr = [10, 18, 4, 5, 9, 6, 16, 12];
quicksort(arr);
console.log(arr);