C语言选择排序代码优化:修复错误并提升效率
#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;
} 这段代码存在以下问题:
-
在输入一组数时,应使用循环来逐个输入数组元素,而不是使用
scanf("%d ", arr)来输入整个数组。 -
在选择排序的内层循环中,应该从当前位置的下一个位置开始比较,而不是从数组的第一个位置开始比较。
-
在选择排序的内层循环中,交换元素的位置应该在内层循环结束后,而不是在if语句中进行交换。
-
在计算数组长度时,应该使用传入的参数
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;
}
修复后的代码可以正确地进行选择排序并打印排序后的结果。
原文地址: https://www.cveoy.top/t/topic/p5cZ 著作权归作者所有。请勿转载和采集!