首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GapSort或ShellSort没有正确地交换

GapSort或ShellSort没有正确地交换
EN

Stack Overflow用户
提问于 2019-06-07 13:32:12
回答 1查看 47关注 0票数 1

我正在设置一个GapSort程序,因为有些数组代码不起作用。我遗漏了什么?

代码语言:javascript
复制
void main()
{
    int eX[10] = {1, 3, 49, 29, 20, 8, 28, 24, 10, 29};
    int eXlen = sizeof(eX) / sizeof(int);
    gapSort(eX, eXlen);
} 
void gapSort(int arr[], int len)
    {
        int temp, gap, swap;
        gap = len / 2;
        while (1)
        {
            for (int i = 0; i < len - gap; i++)
            {
                swap = 0;
                if (arr[i] > arr[i + gap])
                {
                    temp = arr[i];
                    arr[i] = arr[i + gap];
                    arr[i + gap] = temp;
                    swap = 1;
                }
            }
            if (swap == 0)
            {
                if (gap == 1)
                    break;
                gap /= 2;
            }
        }
    }

1,3,49,29,20,8,28,24,10,29这类数组不起作用

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-07 14:07:39

您必须将swap = 0;放在for循环之前。

如果在整个循环中没有交换任何内容,则需要更改gap值。对于当前的实现,您可能已经交换了值,例如i=1,但是在下一个循环中会重置swap=0,所以只有当您将值替换为i的最后一个值时,才会使用相同的gap重新迭代。如果您将swap的值显示在arrDisp旁边,您可能已经看到了这个问题。(我假设arrDisp是一个显示数组内容的函数。这个函数调用在编辑之前在最初的问题中。)

代码语言:javascript
复制
static void gapSort(int arr[], int len)
{
    int temp, gap, swap;
    gap = len / 2;
    while (1)
    {
        swap = 0;
        for (int i = 0; i < len - gap; i++)
        {
            if (arr[i] > arr[i + gap])
            {
                temp = arr[i];
                arr[i] = arr[i + gap];
                arr[i + gap] = temp;
                swap = 1;
            }
        }
        /* arrDisp(arr, len); */
        if (swap == 0)
        {
            if (gap == 1)
                break;
            gap /= 2;
        }
    }
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56495339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档