排序算法——希尔排序算法的实现与改进

希尔排序是直接插入排序算法的改进版
1、时间复杂度
最好情况:o(nlogn)
最坏情况:o(n^2)
2、算法思想:
(1)待排序序列分成多个子序列;
(2)每个子序列进行直接插入排序;
具体步骤:
a) 选择一个递减步长序列:s1>s2>s3…….>sk,sk=1;
b) 按照步长k,对序列进行k次排序;
c) 每次排序,根据步长,将整体序列分成长度为m的若干序列,对每个序列进行直接插入排序;
d) 终止条件:步长为1时,对整个序列进行排序;
3、希尔排序算法实现代码

/***************************************************************************
*  @file       main.cpp
*  @author     HAOJIEFENGLANG
*  @date       5  August 2018
*  @remark     5  August 2017
*  @theme      Shel sort
***************************************************************************/
#include<stdio.h>
#include<stdlib.h>

void ShelSort(int a[], int n)
{
    //设置一定的间隔进行跳动
    int i, j, temp, count1, count2;
    int gap = n;
    temp = 0;
    count1 = count2 = 0;

    do
    {
        gap = gap / 3 + 1;
        for (i = gap; i < n; i++)
        {
            count1++;
            if (a[i] < a[i - gap])
            {
                //找位置,同时把前面大于a[i]的值往后移动
                temp = a[i];
                for (j = i - gap; a[j] > temp; j-= gap)
                {
                    count2++;
                    a[j + gap] = a[j];
                }
                a[j + gap] = temp;

            }
        }
    } while (gap>1);
    printf("比较次数%d,移动次数%d\n", count1, count2);
}
int main()
{
    int a[10] = { 1,0,2,3,4,5,6,7,8,9 };
    int n = 10;
    ShelSort(a, n);
    printf("希尔排序后为:  ");
    for (int i = 0; i < n; i++)
        printf("%d ", a[i]);
    printf("\n");
    return 0;
}

猜你喜欢

转载自blog.csdn.net/haojiefenglang/article/details/81430998