我目前正在尝试计算当元素已经在排序对中时通过插入排序完成的比较次数,例如
1 + 3 + 3 + 5 + 5 ... + n + n
目前正致力于解决使用哨兵时所做的最差和平均比例数。
对于每一对都出现故障的最坏情况,我所做的是比较模式为\sum_{n=2}^{n/2}(2n-1)(2)
,导致求和
(n^2+4/2) - 3 - (n-2)
我解决了const { defer, from, concat, EMPTY, timer } = rxjs; // = require("rxjs")
const { mergeMap, take, mapTo, tap } = rxjs.operators; // = require("rxjs/operators")
// simulate network request
function fetchPage(page=0) {
return timer(100).pipe(
tap(() => console.log(`-> fetched page ${page}`)),
mapTo({
items: Array.from({ length: 10 }).map((_, i) => page * 10 + i),
nextPage: page + 1,
})
);
}
const getItems = page => defer(() => fetchPage(page)).pipe(
mergeMap(({ items, nextPage }) => {
const items$ = from(items);
const next$ = nextPage ? getItems(nextPage) : EMPTY;
return concat(items$, next$);
})
);
// process only first 30 items, without fetching all of the data
getItems()
.pipe(take(30))
.subscribe(e => console.log(e));
这看起来对吗?我现在无法尝试解决一般情况。知道如何去做吗?谢谢你的帮助
答案 0 :(得分:0)
您可以一次比较/交换一对邻接数,因此该问题与半长的数组上的普通插入排序相同。每个比较需要比较两个数字,因此平均情况为O((n / 2)^ 2 * 2)= O(n ^ 2/2)。