1.用结构体数组实现希尔排序,源代码如下
把arr[0]没用实际值,从1+delat开始搞
#include
typedef int KeyType;
typedef struct{
KeyType key;
//其他信息;
void print(RecordType a[],int length){
int i=1;
for(i=1;i<=length;i++){
printf("%d ",a[i].key);
}
printf("\n");
}
void Shellnsert(RecordType arr[],int length,int dalat){
int i,j;
for(i=1+dalat;i<=length;i++){
if(arr[i].key
arr[0]=arr[i];
for(j=i-dalat;j>0&&arr[0].key
arr[j+dalat]=arr[j];
}
arr[j+dalat]=arr[0];
}
}
}
void ShellSort(RecordType arr[],int length,int dalat[],int m){
int i;
for(i=0;i
Shellnsert(arr,length,dalat[i]);
}
}
int main()
{
RecordType arr[8];
arr[1].key=46;
arr[2].key=17;
arr[3].key=5;
arr[4].key=42;
arr[5].key=94;
arr[6].key=55;
arr[7].key=13;
arr[8].key=70;
int length=8;
print(arr,length);
int dalta[3]={length/2,length/4,length/8};
ShellSort(arr,length,dalta,3);
print(arr,length);//数组名,长度,增量数组名,增量数组长度
return 0;
}
2.用普通数组实现希尔排序,源代码如下
主要是三个for循环难理解,需要给自己找个例子画一画,就会理解了
#include
void print(int arr[],int n){
int i=0;
for(i=0;i
printf("%d ",arr[i]);
}
printf("\n");
}
void shell(int arr[],int n){
int i,j,inc,key,o=1;
for(inc=n/2;inc>0;inc/=2){
printf("%d\n",o++);
for(i=inc;i
key=arr[i];
for(j=i;j>=inc&&key
{//与前面的进行比较,步长为inc j-inc就是前面元素的下标
arr[j]=arr[j-inc];
}
arr[j]=key;
print(arr,12);
}
}}
int main()
{
int arr[]={15,14,8,9,3,12,13,7,11,10,1,6};
print(arr,12);
shell(arr,12);
return 0;
}