Linux C希尔排序算法实现

希尔排序(Shell's Sort)是插入排序的一种又称“缩小增量排序”(Diminishing Increment Sort),是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。该方法因D.L.Shell于1959年提出而得名
 

注:建议先学习插入排序算法,再产学习希尔排序算法。

时间复杂度:O(n^2)

稳定性:不稳定

测试:

 排序前:   6    1    4    2    5    3
 排序后:  1    2    3    4    5    6

源码:

注:shell_sort和shell_sort2分别用两种方式实现,shell_sort2完全基于插入排序算法。

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

#define ARRAY_N 6

int array[ARRAY_N]={6, 1 , 4, 2, 5, 3};

//int array[ARRAY_N]={1, 3, 2, 4, 5, 6};

void shell_sort(int array[], int n)
{
    int step = 0;
    int i = 0;
    int j = 0;
    int k = 0;
    int tmp = 0;


    for (step = n / 2; step > 0; step = step / 2)
    {
        for (i = 0; i < step; i++)
        {
            for (j = i + step; j < n; j = j + step)
            {
                if (array[j] < array[j - step])
                {
                    tmp = array[j];
                    for (k = j - step; k >= 0; k = k-step)
                    {
                        if (tmp < array[k])
                        {
                            array[k + step] = array[k];
                        }
                        else
                        {
                            break;
                        }
                    }

                    array[k + step] = tmp;
                }
            }
        }
    }

}

void shell_sort2(int array[], int n)
{
    int step = 0;
    int i = 0;
    int j = 0;
    int k = 0;
    int l = 0;
    int tmp = 0;


    for (step = n / 2; step > 0; step = step / 2)
    {
        for (i = 0; i < step; i++)
        {
            for (j = i + step; j < n; j = j + step)
            {

                for (l = j - step; l >= 0; l = l - step)
                {
                    if (array[j] > array[l])
                    {
                        break;
                    }
                }

                if (l != j - step)
                {
                    tmp = array[j];
                    for (k = j - step; k > l; k = k-step)
                    {
                        array[k + step] = array[k];
                    }

                    array[k + step] = tmp;

                }
            }
        }
    }

}

int show_list(int array[], int n)
{
    int i = 0;

    for (i=0; i < ARRAY_N; i++)
    {

        printf("%5d", array[i]);
    }

    printf("\n");

    return 0;
}

int main(void)
{
    int tmp[6] = {0};

    show_list(array, ARRAY_N);

    shell_sort(array, ARRAY_N);

    //shell_sort2(array, ARRAY_N);

    show_list(array, ARRAY_N);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/szkbsgy/article/details/82380627