如何解决C中选择排序的修改版本
我试图修改选择排序,将最大的元素放在数组的末尾,然后对 n - 1 个项目重复选择排序,直到 n 为 0。我的代码编译但输出仍然一个未排序的数组,请帮帮我!
#include <stdio.h>
void selection_sort(int arr[],int n);
int main ()
{
int n;
scanf("%d",&n);
int arr[n];
for (int i = 0; i < n; i++)
scanf("%d",&arr[i]);
selection_sort(arr,n);
for(int i = 0; i < n; i++)
printf("%d\n",arr[i]);
return 0;
}
void selection_sort(int arr[],int n)
{
if(n <= 0)
return;
while(n > 0)
{
int max = 0;
int temp,x;
for(int i = 0; i < n; i++)
{
if(arr[i] >= max)
max = arr[i];
x = i;
}
temp = arr[n - 1];
arr[n - 1] = max;
arr[x] = temp;
selection_sort(arr,--n);
}
}
解决方法
部分
if(arr[i] >= max)
max = arr[i];
x = i;
错了。你忘记写 {}
,所以 x = i;
被无条件执行,循环后的交换总是用最后一个元素完成。这意味着交换是在同一个元素之间完成的,实际上什么都不做。
另请注意,同时执行循环 while(n > 0)
和递归 selection_sort(arr,--n);
是浪费。您只需要其中之一。
另一个注意事项是使用 max
初始化 0
会使其在输入数组的所有元素都为负数时行为错误。
最后,您应该使用一致的缩进正确格式化代码。
试试这个:
void selection_sort(int arr[],int n)
{
if(n <= 0)
return;
while(n > 0)
{
int max = arr[0];
int temp,x;
for(int i = 0; i < n; i++)
{
if(arr[i] >= max)
{
max = arr[i];
x = i;
}
}
temp = arr[n - 1];
arr[n - 1] = max;
arr[x] = temp;
--n;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。