сортировать случайный массив, используя только один цикл без функции сортировки

1

я могу сортировать случайный массив, используя только один цикл без использования функции сортировки??? но могу ли я сделать то же самое, что и для цикла? Как я могу это сделать? здесь я использую вложенный цикл

$(document).ready(function () {
  function sortarr(arr) {
    for (var i = 0; i < arr.length; i++) {
      for (var j = i + 1; j < arr.length; j++) {
        if (arr[i] > arr[j]) {
          var temp = arr[i];
          arr[i] = arr[j];
          arr[j] = temp;
        }
      }
    }
    return arr;
  }
  console.log(sortarr([10, 18, 4, 5, 9, 6, 16, 12]));
});
  • 0
    Почему вы не хотите использовать сортировку?
  • 0
    console.log(sortarr([10,18,4,5,9,6,16,12]));}); что здесь происходит с этой строкой?
Показать ещё 9 комментариев
Теги:

3 ответа

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);
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);
}

Но, как указано в комментариях выше, это не будет быстрее, чем подход с несколькими циклами, возможно, медленнее.

0

Здесь представлен график, показывающий различные алгоритмы сортировки и их сложности:

Изображение 174551

Один проход через цикл без рекурсии или вложенности - это O (n), поэтому нет, но не в худшем случае. Существуют и другие методы сортировки, которые могут быть включены для сортировки массива с использованием одного цикла, как показывает Jonas W., но их временная сложность не всегда хороша, как старый добрый .sort() который является Quicksort.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню