一、代码
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define MAXSIZE 20
typedef int Status;
void shellSort(int data[],int dataArrLenght);
void shellSort(int data[],int dataArrLenght);
int main(int argc, char *argv[]) {
int data[MAXSIZE],i,arrSize;
printf("请输入待排序的数组大小:");
if(scanf("%d",&arrSize)==0)
{
printf("输入有误!\n");
return ERROR;
}
printf("请输入待排序数组:");
data[0]=0;
for(i=1;i<=arrSize;i++)
{
scanf("%d",&data[i]);
}
printf("开始简单选择排序\n");
shellSort(data,arrSize);
for(i=1;i<=arrSize;i++)
{
printf("%5d",data[i]);
}
return 0;
}
void shellSort(int data[],int dataArrLenght)
{
int increment=dataArrLenght;
int i,j;
do{
increment=increment/3+1;//增量序列
for(i=increment+1;i<=dataArrLenght;i++)
{
if(data[i]<data[i-increment])
{
data[0]=data[i];
for(j=i-increment;j>0&&data[j]>data[0];j-=increment)
{
data[j+increment]=data[j];//元素后移动
}
data[j+increment]=data[0];
}
}
}while(increment>1);
}
二、算法解释
其实希尔排序和直接插入排序差不多,两者主要的差别在于希尔排序中有增量概念但是核心代码很相似。其中增量的作用就是把一个数列分为若干部分,每个部分的相同位置元素进行比较。