注册 登录
编程论坛 C++教室

希尔排序出错

最近不在 发布于 2010-12-30 00:35, 420 次点击
程序代码:
//插入排序
void sort1(int a[], int n)
{
    for(int i = 1; i != n; ++i)
    {
        //如果当前数字比相邻的数小
        if(a[i] < a[i-1])
        {
            int j;
            int temp = a[i];
            for(j = i-1; temp < a[j]; --j)
            {
                //数字右移
                a[j+1] = a[j];
            }
            a[j+1] = temp;
        }
    }
}

//希尔排序
void ShellInsert(int a[], int n, int d)
{
    for(int i = d; i != n; ++i)
    {
        ////如果当前数字比相邻的数小
        if(a[i] < a[i-d])
        {
            int j;
            int temp = a[i];
            for(j = i-d; j >= 0 && temp < a[j]; j -= d)
            {
                //元素右移
                a[j+d] = a[j];
            }
            a[j+d] = temp;
        }
    }
}

void ShellSort(int a[], int n)
{
    int d = n/2;
    while(d != 1)
    {
        //增量插入排序
        ShellInsert(a, n, d);
        d = d/2;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    int a[] = {7, 2, 5, 3, 6};

    int n = sizeof(a)/sizeof(*a);
    ShellSort(a, n);
    for(int i = 0; i != n; ++i)
    {
        cout<<a[i]<<endl;
    }

    return 0;
}

根据规则照着插入排序得出的代码,但排序结果不对,网上搜了下,貌似也差不多,求排错啊!
1 回复
#2
lintaoyn2010-12-30 08:13
程序代码:
void ShellSort(int a[], int n)
{
    int d = n/2;
    while(d)//最后的步长为1,就是得和普通插入一样
    {
        //增量插入排序
        ShellInsert(a, n, d);
        d = d/2;
    }
}
1