这段插入排序代码有什么问题?

问题描述 投票:0回答:1

我使用嵌套 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;
}
arrays c sorting insertion-sort
1个回答
0
投票

嵌套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' );
}
© www.soinside.com 2019 - 2024. All rights reserved.