stooge中的c ++ ceil()排序不起作用

时间:2018-04-11 01:46:23

标签: c++ sorting ceil

我正在实施一个stooge排序。

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)似乎存在问题,因为它没有返回正确的数字。例如,如果大小计算为4,则mid应保持3,因为(2 * 4)/ 3的上限为3.但是,它保持为2.

我有#include <cmath>using std::ceil。无论我做什么类型的转换,它要么保持错误的数字,要么最终在此函数的顶部抛出堆栈溢出错误。有任何想法吗?谢谢!

注意:将3更改为3.0会导致函数顶部出现堆栈溢出错误

1 个答案:

答案 0 :(得分:2)

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);
    }
}