Henkk

导航

排序算法之----希尔排序

#include <stdio.h>
#include <stdlib.h>

//希尔排序
//基本思想:也称为缩小增量排序;先分成多组,组的个数即增量的值;增量逐渐递减至1即组个数递减至1
//时间复杂度:nlogn
//增量t的取法:最初shell提出取increment=n/2向下取整,increment=increment/2向下取整,直到increment=1。
//但由于直到最后一步,在奇数位置的元素才会与偶数位置的元素进行比较,这样使用这个序列的效率会很低。
//后来Knuth提出取increment=n/3向下取整+1.还有人提出都取奇数为好,也有人提出increment互质为好。
//应用不同的序列会使希尔排序算法的性能有很大的差异。

//希尔排序思想+插入排序
void ShellSort(int k[], int n)
{
    int i, j, tmp;
    int step = n;
    do
    {
        step = step / 3 + 1;
        for (i = step; i < n; i++)
        {
            if (k[i] < k[i - step])
            {
                tmp = k[i];
                for (j = i - step; (j >= 0 )&&(k[j] > tmp); j -= step)
                {
                    k[j + step] = k[j];
                }
                k[j + step] = tmp;
            }
        }
    } while (step > 1);
}

//希尔排序思想+冒泡排序
void ShellSort2(int k[], int n)
{
    int i, j, tmp;
    int step = n;
    do
    {
        step = step / 3 + 1;
        for (i = 0; i < n; i++)
        {
            for (j = i; j < n - step; j += step)
            {
                if (k[j] > k[j + step])
                {
                    tmp = k[j];
                    k[j] = k[j + step];
                    k[j + step] = tmp;
                }
            }
        }
    } while (step > 1);
}

void print(int a[], int num)
{
    int i = 0;
    for (i = 0; i < num; i++)
    {
        printf("%d ", a[i]);
    }
    printf("\n");
}

int main()
{
    int a[10] = { 2, 3, 56, 1, 4, 7, 8, 94, 3, 10 };
    int b[10] = { 2, 3, 56, 1, 4, 7, 8, 94, 3, 10 };
    print(a, 10);
    print(b, 10);

    ShellSort(a, 10);
    print(a, 10);

    ShellSort2(b, 10);
    print(b, 10);

    return system("pause");
}

 

posted on 2019-07-18 15:20  Henkk  阅读(263)  评论(0编辑  收藏  举报