希尔排序Linux下c 实现

     这次,我们谈论下希尔排序,希尔排序也叫递减增量排序算法。步长也是影响希尔排序的一个重要因素,我们这里主要用Marcin Ciura设计的步长。关键代码如下:

1、希尔排序头文件:shellSort.h

#ifndef SHELLSORT_H
#define SHELLSORT_H
extern void shellSort(int * pArr, const int length);
#endif


2、希尔排序源文件:shellSort.c

#include "shellSort.h"
void shellSort(int * pArr, const int length)
{
        const int pInc[9]={1,4,10,23,57,132,301,701,1750};
        int len=sizeof(pInc)/sizeof(int);
        int i,k,j,tmp;
        int inc;
        k=0;
        while(*(pInc+k)<length && k<=len)
        {
                k++;
        }
        while(--k>=0)
        {
                inc=*(pInc+k);
                for(i=inc; i< length; i++)
                {
                        tmp=*(pArr+i);
                        j=i;
                        while(j>=inc && *(pArr+j-inc)>tmp)
                        {
                                *(pArr+j)=*(pArr+j-inc);
                                j=j-inc;
                        }
                        *(pArr+j)=tmp;
                }
        }
}


3、main头文件:main.h

#ifndef MAIN_H
#define MAIN_H
#include<stdio.h>
#include "shellSort.h"
int main(void);
void showArr(const int *pArr, const int length);
void initRandomArr(int *pArr, const int length);
#endif


4、main源文件:main.c

#include "main.h"

int main(void)
{
        printf("Input array length:\n");
        int length;
        scanf("%d", &length);
        if(length<0)
        {
                printf("Array length must be larger 0\n");
                return 1;
        }
        int arr[length];
        initRandomArr(arr, length);
        printf("Get random array :\n");
        showArr(arr, length);
        shellSort(arr, length);
        printf("shell sort result:\n");
        showArr(arr, length);
        return 0;
}
void showArr(const int *pArr, const int length)
{
        int i;
        for(i=0; i<length; i++)
        {
                printf("%d ", *(pArr+i));
        }
        printf("\n");
}
void initRandomArr(int *pArr, const int length)
{
        int i;
        srand(time(NULL));
        for(i=0; i< length; i++)
        {
                *(pArr+i)=rand()%1000;
        }
}


5、编译:

[root@localhost shellSort]$ gcc -c shellSort.c
[root@localhost shellSort]$ gcc -c main.c
[root@localhost shellSort]$ gcc -o main main.o shellSort.o


执行可执行文件main如下:         

[root@localhost shellSort]$ ./main 
Input array length:
12
Get random array :
518 713 265 31 350 931 592 872 489 927 640 106 
shell sort result:
31 106 265 350 489 518 592 640 713 872 927 931 


        希尔排序是个不稳定的排序,性能优于直接插入排序

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值