菜鸡笔记之——希尔排序
希尔排序:
时间复杂度:平均O(nlogn);
稳定性:不稳定排序;
思路:
将数据分组,每相隔step(步长),对每一组进行插入排序。希尔排序为插入排序的进一步优化;
代码实现(希尔排序):
# include <stdio.h>
# include <malloc.h>
int main(void)
{
int N;
printf("the number of the array:");
scanf("%d",&N);
int * array = NULL;
array = (int *)malloc(sizeof(int)*N);
if (array==NULL)
{
printf("error!\n");
exit(-1);
}
//输入数组
for (int i = 0;i<N;i++)
{
scanf("%d",array+i);
}
//排序
void shellsort(int *,int);
shellsort(array,N);
//输出
for (int i = 0;i<N;i++)
{
printf("%d\t",*(array+i));
}
free(array);
return 0;
}
void shellsort(int * array,int len) //希尔排序(升序)
{
int i,j,temp;
for (int step = len/2;step>0;step/=2) //每次步长(逐次减半)
{
for (i = step;i<len;i++)
{
temp = *(array+i); //保存当前遍历到的数
for (j = i-step;(j>=0)&&(temp<*(array+j));j-=step) //满足升序规则的进入
{
*(array+j+step) = *(array+j); //覆盖当前遍历到的数
}
*(array+j+step) = temp; //把前面的数用temp填补上
}
}
}
for (j = i-step;(j>=0)&&(temp<*(array+j));j-=step)循环之后的一步为什么是 *(array+j+step) = temp,不是 *(array+j) = temp?
循环最后一步j-=step了。