实现Shell排序

时间:2018-02-24 07:53:11

标签: c++ sorting shellsort

我的老师说行for (int j = i - step; j >= 0; j = j - step)破坏了排序的全部本质。他说我需要使用插入排序功能并将其插入到shell排序中。我怎么能这样做?

template < typename T >
void swap(T* arr, int j, int step)
{
    T value = arr[j];
    arr[j] = arr[j + step];
    arr[j + step] = value;
}

template < typename T >
void shell_sort(T* arr, int length)
{
    for (int step = length / 2; step > 0; step = step / 2)  
    {
        for (int i = step; i < length; i++)                 
        {
            for (int j = i - step; j >= 0; j = j - step)    
            {
                if (arr[j] > arr[j + step])                 
                {
                    swap(arr, j, step);                     
                }
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

你可以像这样进行递归shell排序:

template < typename T >
 int shell_sort(T* arr,  int length)
 {
    if (length <= 1)    return length;
    length = shell_sort(arr,length - 1);
    T value = arr[length];
    T i = length - 1;
    while ((i >= 0) && (arr[i] > value)) {
        arr[i + 1] = arr[i];
        i--;
    }
    arr[i + 1] = value;
    return length + 1;
}