近期由于身体不适,好久不曾写博客了。但是觉得生病不应该成为不学习的借口,所以今天开始还是继续自己的学习之旅。因为一旦停的时间久了,借口会越来越多,最后重蹈覆辙,之前的努力又白费了。
今天写的是希尔排序。希尔排序是插入排序的一种。它将待排序的数组按照一定间隔分为若干个子序列,对每个子序列分别进行直接插入排序。然后缩小间隔,继续上述过程,直至间隔为1,则为普通插入排序。
算法代码如下:
#include <stdio.h>
//data为待排序数组,interval为开始间隔,len为数组长度
void shellInsert(int data[],int interval,int len)
{
int i = 0;
int j = 0;
for(i = interval + 1;i < len;i++)
{
if(data[i] < data[i - interval])
{
data[0] = data[i];
for(j = i - interval;j > 0 && (data[j] > data[0]);j = j - interval)
{
data[j + interval] = data[j];
}
data[j + interval] = data[0];
}
}
}
//data为待排序数组,interval为间隔数组,len1为代排序数组长度,len2为间隔数组长度
void shellSort(int data[],int interval[],int len1,int len2)
{
int i = 0;
for(i = 0;i < len2;i ++)
{
shellInsert(data,interval[i],len1);
}
}
int main()
{
int i = 0;
int data[] = {0,35,42,25,19,33,24,58,66,34,20};
int interval[] = {5,3,1};
for(i = 1;i < 11;i++)
{
printf("%d ",data[i]);
}
printf("\n");
shellSort(data,interval,11,3);
for(i = 1;i < 11;i ++)
{
printf("%d ",data[i]);
}
printf("\n");
return 0;
}
一周没有敲代码便已经生疏了,倘若真是过了一个月都不写的话估计连最基本的东西都写不出来了。即时记忆力再好,也不如天天练习靠谱!以后风雨无阻,全年无休,坚持自己的代码之路~