我可以使用一个循环对随机数组进行排序而不使用sort函数???但是我可以使用一个for循环吗?我怎样才能做到这一点 ? 这里我使用嵌套循环
Vue.use()
答案 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)
这是一个显示各种排序算法及其复杂性的图表:
单次通过一个没有递归或嵌套的循环是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);