32. 排序算法(5):希尔排序

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dugudaibo/article/details/79480795

1. 基本原理

  直接插入排序算法 (Straight Insertion Sort) 适用于基本有序且记录数少的数组,但是这样的要求已经算比较苛刻了。所以一个直观的改进方法是,对于一个数组,可以使它变得基本有序,再用用希尔排序改进直接插入排序就会得到比较好的结果,如下图所示

初始的时候将间隔为 4 的元素通过直接插入排序的方法进行排序,之后将的得到的结果中间隔为 2 的元素通过直接插入排序的方法进行排序,最后对整体进行直接插入排序,因为前两步相当于已经将数组变为一个基本有序的数组,所以会降低排序的复杂程度。

2. 代码实现

#include <stdio.h>

void InsertSort(int k[], int n)
{
    int i, j, temp;
    int gap = n;

    do
    {
        gap = gap/3 + 1;    //改变间隔,不再是相邻之间进行比较,而是具有一定间隔的元素之间进行比较

        for( i=gap; i < n; i++ )
        {
            if( k[i] < k[i-gap] )
            {
                temp = k[i];

                for( j=i-gap; k[j] > temp; j-=gap )
                {
                    k[j+gap] = k[j];
                }

                k[j+gap] = temp;
            }
        }
    }while(gap > 1);
}

int main()
{
    int i, a[10] = {5, 2, 6, 0, 3, 9, 1, 7, 4, 8};

    InsertSort(a, 10);

    printf("排序后的结果是:");
    for( i=0; i < 10; i++ )
    {
        printf("%d", a[i]);
    }
    printf("\n\n");

    return 0;
}

猜你喜欢

转载自blog.csdn.net/dugudaibo/article/details/79480795