希尔排序
简单描述:希尔排序是对插入排序的改进,插入排序每次只能移动一位,速度较慢;通过对数据进行分组,可以实现跨越式移动。
基本思想:
(1)首先是步长的选择,首先是数组长度的一半,然后再每次减半最后直到步长为1;
(2)按照步长对数据进行插入排序;
时间复杂度:比简单插入排序(o(n^2))要好,是在o(nlogn)~o(n^2)之间,平均时间复杂度为o(n^3/2)
空间复杂度:原地排序 o(1)
稳定性:不稳定
适用情况:希尔排序算是一种基于插入排序的算法,所以对数据有序敏感。如果数据基本有序则推荐用希尔排序
实现代码(c语言)
简单描述:希尔排序是对插入排序的改进,插入排序每次只能移动一位,速度较慢;通过对数据进行分组,可以实现跨越式移动。
基本思想:
(1)首先是步长的选择,首先是数组长度的一半,然后再每次减半最后直到步长为1;
(2)按照步长对数据进行插入排序;
时间复杂度:比简单插入排序(o(n^2))要好,是在o(nlogn)~o(n^2)之间,平均时间复杂度为o(n^3/2)
空间复杂度:原地排序 o(1)
稳定性:不稳定
适用情况:希尔排序算是一种基于插入排序的算法,所以对数据有序敏感。如果数据基本有序则推荐用希尔排序
实现代码(c语言)
#include<stdio.h>
#include<stdlib.h>
void shellsort(int a[],int len)
{
int i,j,step,temp;
for(step=len/2;step>0;step/=2)
{
for(i=step;i<len;i++)
{
for(j=i-step;j>=0;j-=step)
{
if(a[j]>a[j+step])
{
temp=a[j];
a[j]=a[j+step];
a[j+step]=temp;
}
}
}
}
}
void showarray(int a[],int len)
{
int i;
for(i=0;i<len;i++)
printf("%d ",a[i]);
printf("\n");
}
int main()
{
int a[]={1,5,4,32,7,6,9};
showarray(a,7);
shellsort(a,7);
showarray(a,7);
return 0;
}