#include <stdio.h>
int shsort(int a[], int n)
{
int d;
for( d=n/2;d>0;d/=2){
for(int i=d;i<n;i++){
int temp =a[i];
int j =i;
while(a[j-d]>a[j] && j>0){
a[j] = a[j-d];
a[j-d] = temp;
j=j-d; //j--;一直和前面那个比,这里减去差值d,直到前面的小于后面的
}
}
}
}
int main()
{
int a[6] = {5,4,2,3,7,6};
shsort(a, 6);
printf("\n");
printf("排序后的顺序是:\n");
for(int i=0;i<6;i++)
printf("%5d",a[i]);
printf("\n");
return 0;
}
!!!才发现以上代码为错误代码,当数据多的时候会出现乱序,注意观察j的值,上面的代码我while循环的条件为j>0,但是可能出现d较小的时候也进入循环,造成数据丢失重复,事实上只要>=d就行了
改正后的代码:
#include <stdio.h>
int shsort(int a[], int n)
{
int d;
for( d=n/2;d>0;d/=2){
for(int i=d;i<n;i++){
int temp =a[i];
int j =i;
while(a[j-d]>a[j] && j>=d){
a[j] = a[j-d];
a[j-d] = temp;
j=j-d; //j--;一直和前面那个比,这里减去差值d,直到前面的小于后面的
}
}
}
}
int main()
{
int a[20] = {58,23,25,45,25,10,23,6,5,82,41,20,27,30,36,45,17,6,1,29};
shsort(a, 20);
printf("排序后的顺序是:\n");
for(int i=0;i<20;i++){
printf("%5d",a[i]);
}
return 0;
}