#include<stdio.h>

void swap(int *a, int *b) { int temp = *a; *a = *b; *b = temp; }

void select(int arr[], int len) { for (int i = 0; i < len; ++i) { int min = i; for (int j= 0; j < len; ++j)
{ if (arr[j] > arr[min]) { min = j; } swap(&arr[min],&arr[i]); } } }

int main(int argc, char const *argv[]) { int n; printf("请输入数组大小:\n"); scanf("%d",&n);

int arr[n];
printf("请输入一组数:");
scanf("%d ", arr);

int len = sizeof(arr) / sizeof(arr[0]);

select(arr, len);

for (int m = 0; m < len; ++m)
{
	printf("%d ", arr[m]);
}
printf("\n");

return 0;

} 这段代码存在以下问题:

  1. 在输入一组数时,应使用循环来逐个输入数组元素,而不是使用scanf("%d ", arr)来输入整个数组。

  2. 在选择排序的内层循环中,应该从当前位置的下一个位置开始比较,而不是从数组的第一个位置开始比较。

  3. 在选择排序的内层循环中,交换元素的位置应该在内层循环结束后,而不是在if语句中进行交换。

  4. 在计算数组长度时,应该使用传入的参数len而不是通过sizeof(arr) / sizeof(arr[0])来计算。

修复后的代码如下:

#include<stdio.h>

void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}

void select(int arr[], int len)
{
    for (int i = 0; i < len; ++i)
    {
        int min = i;
        for (int j = i + 1; j < len; ++j)
        {
            if (arr[j] < arr[min])
            {
                min = j;
            }
        }
        swap(&arr[min], &arr[i]);
    }
}

int main(int argc, char const *argv[])
{
    int n;
    printf("请输入数组大小:\n");
    scanf("%d", &n);

    int arr[n];
    printf("请输入一组数:");
    for (int i = 0; i < n; ++i)
    {
        scanf("%d", &arr[i]);
    }

    int len = n;

    select(arr, len);

    for (int m = 0; m < len; ++m)
    {
        printf("%d ", arr[m]);
    }
    printf("\n");

    return 0;
}

修复后的代码可以正确地进行选择排序并打印排序后的结果。

C语言选择排序代码优化:修复错误并提升效率

原文地址: https://www.cveoy.top/t/topic/p5cZ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录