希尔排序:简单地说,希尔排序就是进行多次的插入排序,次数由增量决定(又称缩小增量排序,最后增量减小到1)。适合元素多的情况。
一次插入排序是稳定的,不会改变相同元素的相对顺序,但在不同的插入排序过程中,相同的元素可能在各自的插入排序中移动,最后其稳定性就会被打乱,所以希尔排序是不稳定的。
随机数:
要产生[m,n]范围内的随机数num,可用:
int num=rand()%(n-m+1)+m;
其中的rand()%(n-m+1)+m。
或者说rand()%x+y所产生的随机数在[y,x+y-1]这个区间。
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
void shellsort(int b[],int count)
{
int set[3]={5,2,1};//设置增量
int i,j,getset,temp,j2;
for(i=0;i<3;i++)
{
getset=set[i];//获取增量
for(j=getset;j<count;j++) // 这种方式并不是先分组再插入排序
{ // 是一边分组一边插入排序,多组轮换插入排序
j2=j;
for(;b[j2]<b[j2-getset]&&(j2-getset)>=0;j2=j2-getset)//元素在自己的组进行插入排序
{
temp=b[j2];
b[j2]=b[j2-getset];
b[j2-getset]=temp;
}
}
/* printf("--------shellsort--------\n");按增量查看插入排序是否正确
for(int n=0;n<20;n++)
{
printf("%d\t",b[n]);
if(n==9||n==19)printf("\n");
}*/
}
}
int main()
{
int a[20],n;
printf("产生20个随机数(范围为10到100):\n");
//直接用rand()会产生伪随机数,编译一次多次输出结果一样
srand((unsigned)time(NULL));//把当前时间设置为随机函数的种子,每次产生的数不一样
for(n=0;n<20;n++)
{
a[n]=rand()%91+10;//随机数区间设置为-100到100
printf("%d\t",a[n]);
if(n==9||n==19)printf("\n");
}
shellsort(a,20);
printf("--------after--shellsort--------\n");
for(n=0;n<20;n++)
{
printf("%d\t",a[n]);
if(n==9||n==19)printf("\n");
}
}