基尔排序——C语言描述
基尔排序——C语言描述
0 测试用例框架
1 定义
算法思想:引入增量Incre(如Incre = Num / 2,不一定为最优),将原来的无序序列划分多个子序列,然后以增量Incre尺度进行插入排序,先使得多个无序子序列变得有序。当Incre为1时,该序列已经基本有序,然后进行一次完整的插入排序。
注意:
① 最外层循环控制增量的变化;
② 里面两层是与插入排序一致,中间那层的初始值应为Incre,最里面那层循环迭代,j -= Incre,j每次都需要减Incre.
2 代码
/*ShellSort*/
void ShellSort(int *Arr, int Num) {
int i, j, Tmp, Incre;
if ((Arr == NULL) || (Num <= 1)) {
return ;
}
for (Incre = Num / 2; Incre > 0; Incre /= 2) {
for (i = Incre; i < Num; i++) {
if (Arr[i] < Arr[i - Incre]) {
Tmp = Arr[i];
for (j = i - Incre; (Arr[j] > Tmp) && (j >= 0); j -= Incre) {
Arr[j + Incre] = Arr[j];
}
Arr[j + Incre] = Tmp;
}
}
}
}
4 测试用例
void TestCmpArr(int *CmpArr, int Num, int *Arr) {
int Index = 0;
int CmpNum = 0;
TestNum++;
for (Index = 0; Index < Num; ++Index) {
if (CmpArr[Index] == Arr[Index]) {
CmpNum++;
}
}
if (CmpNum != Num) {
printf("Incorrect!\n");
FaildNum++;
}
else {
printf("Correct!\n");
PassNum++;
}
}
/*TestShellSort*/
void TestShellSort(void) {
/*Test01: Normal*/
int Arr01[] = { 1, 3, 2, 5, 4, 0 };
int Num01 = 6;
int CmpArr01[] = { 0, 1, 2, 3, 4, 5 };
/*Test02: Normal*/
int Arr02[] = { 7, 6, 5, 4, 3, 2, 1, 0 };
int Num02 = 8;
int CmpArr02[] = { 0, 1, 2, 3, 4, 5, 6, 7 };
/*Test03: Two Mem*/
int Arr03[] = { 1, 0 };
int Num03 = 2;
int CmpArr03[] = { 0, 1 };
/*Test04: Only 1 Mem*/
int Arr04[] = { 0 };
int Num04 = 1;
int CmpArr04[] = { 0 };
printf("-------Test start----------\n");
InitNum();
/*Test01*/
printf("\n-------Test 01----------\n");
ShellSort(Arr01, Num01);
PrintArr(Arr01, Num01);
TestCmpArr(CmpArr01, Num01, Arr01);
/*Test02*/
printf("\n-------Test 02----------\n");
ShellSort(Arr02, Num02);
PrintArr(Arr02, Num02);
TestCmpArr(CmpArr02, Num02, Arr02);
/*Test03*/
printf("\n-------Test 03----------\n");
ShellSort(Arr03, Num03);
PrintArr(Arr03, Num03);
TestCmpArr(CmpArr03, Num03, Arr03);
/*Test04*/
printf("\n-------Test 04----------\n");
ShellSort(Arr04, Num04);
PrintArr(Arr04, Num04);
TestCmpArr(CmpArr04, Num04, Arr04);
/*Test Result*/
printf("\n-------Test result----------\n");
TestResult();
}
打印结果:
-------Test start----------
-------Test 01----------
Arr[0] = 0
Arr[1] = 1
Arr[2] = 2
Arr[3] = 3
Arr[4] = 4
Arr[5] = 5
Correct!
-------Test 02----------
Arr[0] = 0
Arr[1] = 1
Arr[2] = 2
Arr[3] = 3
Arr[4] = 4
Arr[5] = 5
Arr[6] = 6
Arr[7] = 7
Correct!
-------Test 03----------
Arr[0] = 0
Arr[1] = 1
Correct!
-------Test 04----------
Arr[0] = 0
Correct!
-------Test result----------
Print test result;
TestNum = 4, PassNum = 4, FaildNum = 0
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」