作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
谁能用英语解释一下非递归合并排序是如何工作的?
谢谢
最佳答案
非递归合并排序通过考虑输入数组上的窗口大小 1,2,4,8,16..2^n 来工作。对于每个窗口(下面代码中的“k”),所有相邻的窗口对都合并到一个临时空间中,然后放回数组中。
这是我的单一函数,基于 C 的非递归归并排序。输入和输出在'a'中。 “b”中的临时存储。有一天,我想要一个就地的版本:
float a[50000000],b[50000000];
void mergesort (long num)
{
int rght, wid, rend;
int i,j,m,t;
for (int k=1; k < num; k *= 2 ) {
for (int left=0; left+k < num; left += k*2 ) {
rght = left + k;
rend = rght + k;
if (rend > num) rend = num;
m = left; i = left; j = rght;
while (i < rght && j < rend) {
if (a[i] <= a[j]) {
b[m] = a[i]; i++;
} else {
b[m] = a[j]; j++;
}
m++;
}
while (i < rght) {
b[m]=a[i];
i++; m++;
}
while (j < rend) {
b[m]=a[j];
j++; m++;
}
for (m=left; m < rend; m++) {
a[m] = b[m];
}
}
}
}
顺便说一句,要证明这是 O(n log n) 也很容易。窗口大小的外层循环增长为 2 的幂,因此 k 有 log n 次迭代。虽然内循环覆盖了很多窗口,但给定 k 的所有窗口加起来正好覆盖了输入数组,因此内循环是 O(n)。合并内循环和外循环:O(n)*O(log n) = O(n log n)。
关于algorithm - 非递归归并排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1557894/
本文实例汇总了Java各种排序算法。分享给大家供大家参考,具体如下: 1. 冒泡排序: ?
1.冒泡排序 它重复地走访过要排序的元素列,依次比较两个相邻的元素,如果顺序错误就把他们交换过来。走访元素的工作是重复地进行直到没有相邻元素需要交换,也就是说该元素列已经排序完成。 算法步
前言 平时用惯了高级语言高级工具高级算法,难免对一些基础算法感到生疏。但最基础的排序算法中实则蕴含着相当丰富的优化思维,熟练运用可起到举一反三之功效。 选择排序 选择排序几乎是
我是一名优秀的程序员,十分优秀!