///希尔排序
void insertI(int * arr, int gap, int i)
{
int *inserted = (arr + i);
int j = 0;
for (j = i - gap; j >= 0 && *inserted < *(arr + j); j -= gap)
{
*(arr + j + gap) = *(arr + gap);
}
*(arr + j + gap) = *inserted;
}
void shellSort(int *arr, int len)
{
int N = len;
for (int gap = N / 2; gap > 0; gap /= 2)
{
for (int i = gap; i < N; i++)
insertI(arr , gap, i);
}
}
int main()
{
int arr[10] = { 2, 34, 52, 6, 76, 1, 3, 56, 34, 87, };
int len = sizeof(arr) / sizeof(arr[0]);
shellSort(arr, len);
for (int i = 0; i < len; i++)
printf("%3d", arr[i]);
return 0;
}
只在函数insertI里有两个小问题:
1) int *inersted 记录指针,这个单元得数据其实需要记录下来,否则会被覆盖。所以改成整数类型。
2) 有一个下标错了,*(arr + j + gap) = *(arr + gap); 应该是*(arr + j + gap) = *(arr + j);
改来 这两个小地方后运行通过了。
有时候用指针比数组下标快。但也不能走极端。这个程序了用下标会更好读。
#include <stdio.h>
void insertI(int * arr, int gap, int i)
{
int temp = arr[i];
int j = 0;
for (j = i - gap; j >= 0 && temp < *(arr + j); j -= gap)
{
*(arr + j + gap) = *(arr + j);
}
*(arr + j + gap) = temp;
}
void shellSort(int *arr, int len)
{
int N = len;
for (int gap = N / 2; gap > 0; gap /= 2)
{
for (int i = gap; i < N; i++)
insertI(arr , gap, i);
}
}
int main()
{
int arr[10] = { 2, 34, 52, 6, 76, 1, 3, 56, 34, 87, };
int len = sizeof(arr) / sizeof(arr[0]);
shellSort(arr, len);
for (int i = 0; i < len; i++)
printf("%3d", arr[i]);
return 0;
}
// Output:
1 2 3 6 34 34 52 56 76 87
排序有问题,还是运行报错
您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~
如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~
ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632
如果你满意我的回答,请点采纳。你的认可是我们互助的动力。
非常感谢您使用有问必答服务,为了后续更快速的帮您解决问题,现诚邀您参与有问必答体验反馈。您的建议将会运用到我们的产品优化中,希望能得到您的支持与协助!
速戳参与调研>>>https://t.csdnimg.cn/Kf0y