C语言 这段插入排序的代码有什么问题吗?

m528fe3b  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(95)

我创建了一个使用嵌套for的插入排序代码。只是因为我在for循环中单独编写if部分的条件,它会给我不同的答案。请告诉我我的方法有什么问题。
我试着在网上搜索,但我没有得到结果,这是我的代码:

#include <stdio.h>

int main() {
    int i, j;
    int arr[] = {32, 5, 45, 8, 17, 82, 10};
    int size = sizeof(arr) / sizeof(arr[0]);
    
    printf("Before Sorting: ");
    for (i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    
    for (i = 1; i < size; i++) {
        int key = arr[i];
        for (j = i - 1; j >= 0; j--) 
        {
            if(arr[j] > key)
                arr[j + 1] = arr[j];
        }
        arr[j + 1] = key;
    }
    
    printf("\nAfter Sorting: ");
    for (i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }

    return 0;
}
yhxst69z

yhxst69z1#

嵌套for循环的问题在于

for (i = 1; i < size; i++) {
    int key = arr[i];
    for (j = i - 1; j >= 0; j--) 
    {
        if(arr[j] > key)
            arr[j + 1] = arr[j];
    }
    arr[j + 1] = key;
}

arr[0]总是被设置为key,因为在内部for循环之后,j等于-1
你可以重写它们,例如,

for (i = 1; i < size; i++) {
    int key = arr[i];
    j = i - 1;

    for ( ; j >= 0 && key < arr[j]; --j )
    {
        arr[j+1] = arr[j];
    }    

    arr[j+1] = key;
}

请注意,操作符sizeof生成的值的类型为size_t。所以更正确的写法是

size_t size = sizeof(arr) / sizeof(arr[0]);

你也应该在使用变量的最小范围内声明变量。
我会用下面的方法写程序

#include <stdio.h>

int main( void )
{
    int arr[] = { 32, 5, 45, 8, 17, 82, 10 };
    size_t size = sizeof( arr ) / sizeof( arr[0] );

    printf( "Before Sorting: " );
    for ( size_t i = 0; i < size; i++)
    {
        printf( "%d ", arr[i] );
    }
    putchar( '\n' );

    for ( size_t i = 1; i < size; i++ )
    {
        if (arr[i] < arr[i - 1])
        {
            int key = arr[i];

            size_t j = i;

            for ( ; j != 0 && key < arr[j-1]; --j )
            {
                arr[j] = arr[j -1];
            }

            arr[j] = key;
        }
    }

    printf( "\nAfter Sorting: " );
    for ( size_t i = 0; i < size; i++)
    {
        printf( "%d ", arr[i] );
    }
    putchar( '\n' );
}

相关问题