概念及其介绍
希尔排序(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;
}
代码实现: