希尔排序

概念及其介绍

希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。

希尔排序又称缩小增量排序,D.L.shell于1959年在以他名字命名的排序算法中实现了这一思想。

它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。

希尔排序算法的实现思路如下:

1、将待排序序列划分成多个子序列,使用普通的插入排序算法对每个子序列进行排序;

2、按照不同的划分标准,重复执行第一步; 

3、使用普通的插入排序算法对整个序列进行排序。

算法代码:

 

/*===============================================
*   文件名称:shellsort.c
*   创 建 者:     
*   创建日期:2022年08月17日
*   描    述:
================================================*/
#include <stdio.h>
#include <stdlib.h>

//arr-待排序的数组,len-数组总的长度,post-分组的起始位置,step-分组的步长(增量)
void groupsort(int *arr, int len, int post,int step)
{
    int temp;  // 当前需要排序的元素的值
    int i;    // 需要排序元素的计数器
    int j;    // 插入排序时,需要后移元素的计数器

    for (i=post+step;i<len;i=i+step) 
    {
       temp=arr[i];    //待排序元素 
       //从已排序的最右边开始,把大于当前排序的元素后移
       for (j=i-step;j>=0;j=j-step)
       {
           if (arr[j]<=temp) break;  

           arr[j+step]=arr[j];  // 个元素后移
       }

       arr[j+step]=temp; //插入当前排序元素
  }
}

//希尔排序,arr是待排序数组的首地址,len是数组的大小
void shellsort(int *arr,unsigned int len)
{
    int i,step;
    // tep为步长,每次减为原来的一半取整数,最后一次必定为1
    for (step=len/2;step>0;step=step/2)
    {
        //共step个组,对每一组都执行插入排序
        for (i=0;i<step;i++)
        {
            groupsort(arr,len,i,step);
        }
    }

int main(int argc,char *argv[])
{
    int arr[]={52,8,38,6,73,15,31,29,27,2,35,4,19,47,62};
    int len=sizeof(arr)/sizeof(int);

    shellsort(arr,len);//调用插入排序函数对数组排序

    //显示排序结果
    int i; 
    for (i=0;i<len;i++) 
    {
         printf("%2d ",arr[i]); 
    }
    printf("\n");

    return 0;
}

代码实现: 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值