#include <stdio.h>
void ShellSort(int A[], int array_size) {
int i, j, h, v;
for(h = 1; h = array_size/9; h= 3*h + 1);
for(; h > 0; h = h/3) {
for(i=h+1;i=array_size;i++) {
v=A[i];
j=i;
while(i > h && A[j-h] > v) {
A[j] = A[j-h];
j -= h;
}
A[j]=v;
}
}
for(i = 0; i < 6; i++)
printf("%d", A[i]);
}
int main() {
int i;
int A[] = {6,1,4,3,2,5};
int size = 6;
ShellSort(A,size);
return 0;
}
使用C语言进行shell排序的问题。
它不会将数组打印为1 2 3 4 5 6
,即它按原样打印数组。
答案 0 :(得分:1)
只是给出要添加的printf,看看会发生什么:
#include<stdio.h>
void
ShellSort (int A[], int array_size)
{
int i, j, h, v;
for (h = 1; h = array_size / 9; h = 3 * h + 1);
printf("init : h=%d\n", h);
for (; h > 0; h = h / 3)
{
printf("loop : h=%d\n", h);
for (i = h + 1; i = array_size; i++)
{
v = A[i];
j = i;
while (i > h && A[j - h] > v)
{
A[j] = A[j - h];
j -= h;
}
A[j] = v;
}
}
for (i = 0; i < 6; i++)
printf ("%d ", A[i]);
}
int
main ()
{
int i;
int A[] = { 6, 1, 4, 3, 2, 5 };
int size = 6;
ShellSort (A, size);
return 0;
}
=&GT;
init : h=0
6 1 4 3 2 5
它甚至没有进入排序循环。
那么什么是'h = array_size / 9'应该是一个循环测试并且是一种矫揉造作......
这是我认为你想要达到的版本:
#include<stdio.h>
void
ShellSort (int A[], int array_size)
{
int gap, i, j, k, v;
for (i = 1; i < array_size; i = 3 * i + 1)
{
gap=i;
}
printf("init : gap=%d\n", gap);
for (; gap > 0; gap = gap / 3)
{
printf("loop : gap=%d\n", gap);
for (i = gap; i < array_size; i++)
{
printf("inner loop : i=%d\n", gap);
v = A[i];
j = i;
while (j >= gap && A[j - gap] > v)
{
printf("innermost loop : i=%d j=%d gap=%d \n", i,j,gap);
A[j] = A[j - gap];
printf("(%d.%d)", j, j - gap);
j -= gap;
}
A[j] = v;
for (k = 0; k < array_size; k++)
printf ("%d ", A[k]);
printf("\n");
}
}
for (k = 0; k < array_size; k++)
printf ("%d ", A[k]);
}
int
main ()
{
int i;
int A[] = { 9, 1, 4, 3, 2, 5, 7, 6, 8 };
int size = sizeof(A) / sizeof(int);
ShellSort (A, size);
return 0;
}
最终结果是1 2 3 4 5 6 7 8 9如预期的那样。