я могу сортировать случайный массив, используя только один цикл без использования функции сортировки??? но могу ли я сделать то же самое, что и для цикла? Как я могу это сделать? здесь я использую вложенный цикл
$(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]));
});
Если вас это интересует, вы можете реализовать свою собственную быструю сортировку.
Но обратите внимание, что использование сортировки по умолчанию 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);
Вы можете сделать 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);
}
Но, как указано в комментариях выше, это не будет быстрее, чем подход с несколькими циклами, возможно, медленнее.
Здесь представлен график, показывающий различные алгоритмы сортировки и их сложности:
Один проход через цикл без рекурсии или вложенности - это O (n), поэтому нет, но не в худшем случае. Существуют и другие методы сортировки, которые могут быть включены для сортировки массива с использованием одного цикла, как показывает Jonas W., но их временная сложность не всегда хороша, как старый добрый .sort()
который является Quicksort.
console.log(sortarr([10,18,4,5,9,6,16,12]));});
что здесь происходит с этой строкой?