shell排序其实就是对直接插入排序的一个改进,当直接插入的数据很多的时候 就会造成效率很低 为了解决这个问题从而引入了shell排序
什么是shell排序呢 简单来说就是将一堆大数据分割成若干个小数据 将每个小数据里面排序好从而就是将全部数据排列好了
那究竟是如何进行分割分割的呢 首先我们先定义一个增量gap gap=length/2 然后将分割的两部分看成两组数据 依次递进比较对应数
增量gap = gap/2 当gap等于1时就是该数据的最后一次比较顺序了
附上代码:
//函数的参数包含两个,一个是要排序的数组,一个是数组的大小
//函数不使用额外的空间,只用到数组本身。这就要求数组在输入时候保留出
//R[0],R[0]就相当是一个temp。用于互换两个数时的一个临时数。
void shellsort(int R[],int n)
{
int i,j,d;
d = n/2;
while(d >= 1)
{
//注意i的起始和最后的那个“=,我们的第一个数是R[1],所以i-d要从1开始
for(i = d + 1;i <= n;i++)
{
j = i - d;
//将R[i]暂存
R[0] = R[i];
//这边的R[0]就是R[j+d]也就是R[i]
while(j>0 && R[j] > R[0])
{
//将j位置的值给j+d位置
R[j+d] = R[j];
j -= d;
}
//这边就是对应着上面的j-=d,如果上面的while执行了,j
//位置的值已经给了j+d位置了,那么j+d的值也要给j位置,互换
//这就要求下标必须是对应的。所以要将j-d才能满足这边是R[j]
//如果while没有执行,那么还将原来的R[i]的值放到原来位置上
R[j+d] = R[0];
}
//d减半
d/=2;
}
}
#include<stdio.h>
#define N 100
void shellsort(int *,int);
int main(void)
{
int v[N];
int n,i;
printf("输入你数组的大小:");
scanf("%d",&n);
printf("输入%d个数,空格隔开:\n",n);
for(i = 0;i < n; i++)
{
scanf("%d",&v[i]);
}
shellsort(v,n);
printf("shell排序后:");
for(i =0;i < n;i++)
{
printf("%3d",v[i]);
}
printf("\n");
return 0;
}
void shellsort(int v[],int n)
{
int i,j,temp,gap;
for(gap = n/2;gap > 0;gap /=2)
for(i =gap ;i < n ;i++)
for(j = i - gap;j>=0 && v[j] >v[j+gap]; j-=gap)
{
temp = v[j];
v[j] = v[j+gap];
v[j+gap] = temp;
}
}