- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在实现走狗排序。
void stoogeSort(int arr[], int low, int high)
{
int size = high - low + 1;
if (size == 2 && arr[0] > arr[1])
{
int temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
}
else if (size > 2)
{
int mid = (int) ceil((2 * size) / 3);
stoogeSort(arr, low, mid - 1);
stoogeSort(arr, size - mid, high);
stoogeSort(arr, low, mid - 1);
}
}
int mid = (int) ceil((2 * size) / 3)
似乎有问题因为它没有返回正确的数字。例如,如果 size 计算为 4,则 mid 应为 3,因为 (2 * 4)/3 的上限为 3。但是,它为 2。
我有#include <cmath>
和 using std::ceil
在那之下。无论我进行何种类型转换,它要么持有错误的数字,要么最终在该函数的顶部抛出堆栈溢出错误。有任何想法吗?谢谢!
注意:将 3 更改为 3.0 会导致函数顶部发生堆栈溢出错误
最佳答案
int mid = (int) ceil((2 * size) / 3);
您正在进行整数除法并将结果传递给 ceil()
。因此,ceil()
调用无效。
尝试这样的事情:
int mid = ((2 * size) + 2) / 3;
但这并不能解决您真正的问题。你的算法有几个错误。继续执行 Wikipedia这部分:
if (size == 2 && arr[0] > arr[1])
{
int temp = arr[0];
arr[0] = arr[1];
arr[1] = temp;
}
应该是这样的:
if (arr[low] > arr[high])
{
std::swap(arr[low], arr[high]);
}
这部分:
else if (size > 2)
应该是:
if (size > 2)
这个:
int mid = (int) ceil((2 * size) / 3);
应该是:
int mid = size / 3;
还有这个:
stoogeSort(arr, low, mid - 1);
stoogeSort(arr, size - mid, high);
stoogeSort(arr, low, mid - 1);
应该是:
stoogeSort(arr, low, high - mid);
stoogeSort(arr, low + mid, high);
stoogeSort(arr, low, high - mid);
您应该注意 mid
不是中间元素的索引。它是您添加到 low
或从 high
中减去的大小。它可能小于 low
。因此,名称 mid
具有误导性。
将它们拼接在一起你会得到这个:
void stoogeSort(int arr[], int low, int high)
{
if (arr[low] > arr[high])
{
std::swap(arr[low], arr[high]);
}
int size = high - low + 1;
if (size > 2)
{
int mid = size / 3;
stoogeSort(arr, low, high - mid);
stoogeSort(arr, low + mid, high);
stoogeSort(arr, low, high - mid);
}
}
关于c++ ceil() in stooge sort 不工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49765222/
在 Java Concurrency In Practice ,下面给出一个例子来说明如何创建一个不可变类: http://www.javaconcurrencyinpractice.com/list
我知道 Stooge Sort 算法的工作原理如下: Step 1: If the value at the end is smaller than the value at the start, s
这真的可能吗?我在维基百科的低效运动下找到了它,但我还不能完美地想象这个过程,所以我不知道我必须改变什么才能使其稳定。 最佳答案 任何基于比较的排序算法都可以变得稳定。只需更改比较函数,这样,如果两个
我正在实现走狗排序。 void stoogeSort(int arr[], int low, int high) { int size = high - low + 1; if (
我正在努力寻找 Big O 来进行走狗排序。来自维基百科 algorithm stoogesort(array L, i = 0, j = length(L)-1) if L[j] 1 t
我已经在 Python 和 Java 中实现了走狗排序,但是随着输入大小的增加,与 Java 实现相比,Python 中的运行时间似乎呈指数增长。我知道算法在 Java 中比在 Python 中运行得
我是一名优秀的程序员,十分优秀!