希尔排序

希尔排序,又称缩小增量排序,是对插入排序的优化。那么缩小增量是怎么体现出来的呢?前面我们讲过的插入排序,是直接对一组数据进行操作,这样会慢很多;希尔排序会按照一定的间隔把数组分为几段,比如说现在有一个数组array[] = {2,3,6,8,9,4,7,1,5},我们先以3为间隔把数组分为三组,那么分好之后的三组数据分别为{2,8,7}、{3,9,1}、{6,4,5},对分好的数据,利用插入排序的思想对他们进行排序。各组排好之后,每组内就有序了分别为{2,7,8}、{1,3,9}、{4,5,6},这九个数字整体就接近有序了。我们再来对这九个数字进行分组排序,这时候,我们以2为间隔对他来进行分组,这个时候缩小增量就体现出来了,分好的组为{2,8,3,4,6}、{7,1,9,5},再按照插入排序对他们进行排序,排好之后为{2,3,4,6,8}、{1,5,7,9}。然后再缩小增量为1进行插入排序,这次就排好了。

#include 
#include 
#include 

void PrintArray(int* array, int size)
{
    int i = 0;
    for(; i < size; i++)
        printf("%d ", array[i]);
    printf("\n");
}

void Swap(int* pLeft, int pRight)
{
    int temp = 0;
    assert(pLeft);
    assert(pRight);

    temp = *pLeft;
    *pLeft = *pRight;
    *pRight = temp;
}

voif ShellSort(int* array, int size)
{
    int i = 1;
    int gap = size;
    while(gap > 1)
    {
        gap = gap/3 + 1;
        
        for(i = gap; i < size; ++i)
        {
            int key = array[i];
            int end = i - gap;
            
            while(end >= 0 && key < array[end])
            {
                array[end+gap] = array[end];
                end -= gap;
            }

            array[end+gap] = key;
        }
    } 
}

void TestSort()
{
    int array[] = {2, 5, 4, 9, 3, 6, 8, 7, 1, 0};
    PrintArray(array, sizeof(array)/sizeof(array[0]));
    ShellSort(array, sizeof(array)/sizeof(array[0]));
    PrintArray(array, sizeof(array)/sizeof(array[0]));
}

int main()
{
    TestSort();
    system("pause");
    return 0;
}

 

你可能感兴趣的:(希尔排序)