本帖最后由 ing 于 2020-3-27 15:43 编辑
刚开始 (最后一次循环) i:0 - 1 不等于-1(等于4....),清理缓存重启Clion;
但发现实现功能正常,运行却没有任何输出(可能是 i 的值导致);
当我把
size_t i = d; i >= 0; i--
改为
size_t i = d; i > -1; --i
再次调试后发现不会执行断点除的方法(直接停在 } 的位置)
我不知道这是为什么了,C 真是个神奇的东西
________________________________________________________________________________________
今天再次运行发现又可以了,但是 i 为 0 的时候执行 i-- 不等于 -1,导致没有退出循环和因为 i 值过大使程序异常
我换了个编译器,然而并没有解决我的问题....
注意 i 值的变化,减1没有变成-1,因此继续进入循环体
#include <stdio.h>
#include <stdlib.h>
#define MAX 15
typedef struct
{
int r[MAX];
int length;
}SqList;
void shellInsert(SqList *l, int dk)
{
for (size_t i = dk + 1; i <= l->length; i++)
{
if (l->r[i] < l->r[i-dk])
{
int j = 0;
l->r[0] = l->r[i];
for (j = i - dk; j > 0 && (l->r[0] < l->r[j]); j-=dk)
{
l->r[j+dk] = l->r[j];
}
l->r[j+dk] = l->r[0];
}
}
}
void shellSort(SqList *l,int d)
{
//分割的常量
int dk = 0;
for (size_t i = d; i >= 0; i--)
{
dk = 2 * i + 1;
shellInsert(l,dk);
}
}
int main(int argc, char* argv[])
{
SqList *l = (SqList*)malloc(sizeof(SqList));
l->r[1] = 49;
l->r[2] = 38;
l->r[3] = 64;
l->r[4] = 97;
l->r[5] = 76;
l->r[6] = 13;
l->r[7] = 27;
l->r[8] = 49;
l->r[9] = 55;
l->r[10] = 4;
l->length = 10;
//增量
int d = 2;
shellSort(l,d);
for (size_t i = 1; i <= l->length; i++)
{
printf("%2d", l->r[i]);
}
return 0;
}
|