Tag: mergesort

`std :: list <> :: sort()` – 为什么突然切换到自顶向下的策略?

我记得自从时代开始以来,实现std::list<>::sort()的最stream行的方法是以自底向上的方式实现的经典合并sortingalgorithm(另请参阅什么使得gcc std :: listsorting实现如此之快? )。 我记得有人把这个策略恰当地称为“洋葱链”的方法。 至less在GCC的C ++标准库实现中就是这样的(例如,请参阅这里 )。 而这正是MSVC版本标准库中老版本Dimkumware的STL以及MSVC所有版本VS2013的所有版本。 然而,随VS2015提供的标准库突然不再遵循这种分类策略。 VS2015附带的库使用相当简单的recursion实现自顶向下合并sorting。 这让我觉得很奇怪,因为自上而下的方法需要访问列表的中点,以便将其分成两半。 由于std::list<>不支持随机访问,所以find中点的唯一方法是从字面上遍历列表的一半。 另外,最初需要知道列表中元素的总数(在C ++ 11之前不一定是O(1)操作)。 不过,VS2015中的std::list<>::sort()正是这样做的。 下面是该实现的摘录,它定位中点并执行recursion调用 … iterator _Mid = _STD next(_First, _Size / 2); _First = _Sort(_First, _Mid, _Pred, _Size / 2); _Mid = _Sort(_Mid, _Last, _Pred, _Size – _Size / 2); … 正如你所看到的,他们只是无情地使用std::next来遍历列表的前半部分,并到达_Mid迭代器。 我想知道这个开关背后的原因是什么? 我所看到的是在recursion的每个级别重复调用std::next看似明显的低效率。 天真的逻辑说,这是慢的 。 如果他们愿意支付这种价格,他们可能期望得到回报。 他们到底是什么? 我不会立即看到这种algorithm具有更好的caching行为(与原始的自底向上方法相比)。 […]

用MySQL准备的语句“WHERE IN(..)”查询和sorting

想象一下,我们有一个查询: SELECT * FROM somewhere WHERE `id` IN(1,5,18,25) ORDER BY `name`; 和一个ID数组来获取: $ids = array(1,5,18,25) 通过准备好的陈述, build议您准备一个陈述并多次调用它: $stmt = $mysqli->prepare('SELECT * FROM somewhere WHERE `id`=?;'); foreach ($ids as $id){ $stmt->bind_params('i', $id); $stmt->exec(); } 但现在我必须手动sorting结果。 我有什么好的select吗?

合并sorting链接列表

最近我在刷新一些基础知识,发现合并sorting链表是一个很好的挑战。 如果你有一个很好的实现,那么在这里展示它。

为什么quicksort比mergesort更好?

面试中我被问到了这个问题。 他们都是O(nlogn),但是大多数人使用Quicksort而不是Mergesort。 这是为什么?

如何将两个有序数组合并到一个有序数组中?

这是在面试中问我的,这是我提供的解决scheme: public static int[] merge(int[] a, int[] b) { int[] answer = new int[a.length + b.length]; int i = 0, j = 0, k = 0; while (i < a.length && j < b.length) { if (a[i] < b[j]) { answer[k] = a[i]; i++; } else { answer[k] = b[j]; j++; } k++; } while […]

如何使用合并sortingalgorithm就地sorting?

我知道这个问题不是太具体。 我想要的是有人告诉我如何将正常的合并sorting转换为就地合并sorting(或具有恒定额外空间开销的合并sorting)。 我能find的所有网页都是“太复杂”或“超出本文范围”的页面。 唯一已知的就地合并(没有任何额外的空间)的方法太复杂,不能简化为实际的程序。 ( 从这里拿) 即使它太复杂了, 如何进行合并sorting的基本概念是什么?