【发布时间】:2025-02-28 22:55:01
【问题描述】:
我不太擅长记住所有不同的算法,所以我实现了一个,但我不确定如何计算它的大 O 时间,因为有一个移动指针。
这不是很有效,或者至少有更好的排序。
它通过来回移动一个指针来对数组进行排序,从位置 0 开始向右移动,每次交换时返回一次,以便查看左侧的元素是否需要也变了。
代码如下:
function countInversions(arr) {
var count = 0;
var i=0;
while(i < arr.length) {
// look behind
if (i-1 >= 0 && arr[i-1] > arr[i]) {
swap(arr, i, i-1);
count++;
i--;
continue;
}
// look ahead
else if (arr[i] > arr[i+1]) {
swap(arr, i, i+1);
count++;
continue;
}
i++;
}
return count;
}
function swap(arr, i1, i2) {
const temp = arr[i2];
arr[i2] = arr[i1];
arr[i1] = temp;
}
编辑:它看起来像“冒泡排序”。我仍然不确定大o是什么。
【问题讨论】:
-
指针与否,你实现了冒泡排序,对吧?冒泡排序(除非已经排序)通常是 O(n^2)
-
是的,这是冒泡排序,您只需同时进行 2 次迭代。你仍然有 O(n^2),最坏的情况是最大或最小元素靠近中间。
-
是的,你是对的!多谢你们。 @gview