希尔排序的介绍这里就不赘述了,网上有很多。直接上代码,代码在CODEBLOCKS测试通过。
void array_print(int *array,int num)
{
int i;
for(i = 0;i < num; i++)
printf("%d\t",array[i]);
printf("\n");
return;
}
void sort_insert(int *array,int num)
{
int sorted_num = 1;
int i,j,k;
int insert_num;
for(i = 1;i < num;i++)
{
//printf("begin insert %d into list\n",array[i]);
insert_num = array[i];
/* insert i into sorted array[0,sorted_index] */
for(j = 0;j < sorted_num;j++)
{
if(array[i] < array[j])
{
for(k = sorted_num - 1;k >= j;k--)
array[k+1] = array[k];
array[j] = insert_num;
break;
}
}
sorted_num++;
//array_print(array,sorted_num);
}
return;
}
/*
group all items away from gap into new array
sort with sort_inserted
put items from new array back to array
*/
void sort_shell_group(int *list,int num,int gap)
{
int *new_list = malloc(4*num);
int i,j,k;
printf("gap=%d\n",gap);
for(i = 0;i < gap; i++)
{
for(j=i,k=0;j < num ;j += gap)
new_list[k++] = list[j];
sort_insert(new_list,k);
for(j=i,k=0;j < num ;j += gap)
list[j] = new_list[k++];
}
array_print(list,10);
return;
}
void sort_shell(int *list,int num)
{
int gap;
for(gap = num/2;gap > 1;gap /= 2)
sort_shell_group(list,num,gap);
sort_insert(list,num);
return;
}
void sort_test(void)
{
int list[10] = {48,37,64,96,75,12,26,45,54,3};
array_print(list,10);
sort_shell(list,10);
array_print(list,10);
}