如何解决为什么这个选择排序算法不起作用?
我尝试过使用单个 for 循环的选择排序算法。
但输出不如预期。
#include <stdio.h>
int main() {
int arr[10]={6,12,18,11,99,55,45,34,2};
int n=10;
int i=0,j,swap;
for (j =1; j <n; j++) {
if(j==(n-1)){
i++;
j=i+1;
}
if (arr[i] > arr[j]){
swap = arr[j];
arr[j] = arr[i];
arr[i] = swap;}
}
for (int jj = 0; jj < n; jj++)
printf("%d\t",arr[jj]);
return 0;
}
output: 0 6 11 12 18 34 45 55 0 99
解决方法
选择排序使用两个 for
嵌套循环。试试这个代码:
int arr[10]={6,12,18,11,99,55,45,34,2};
int n = 10;
for (int i = 0; i < n - 1; i++) {
for (int j = i + 1; j < n; j++) {
if (arr[i] > arr[j]) {
int swap = arr[i];
arr[i] = arr[j];
arr[j] = aux;
}
}
}
,
对于这个 if 语句的初学者
if (arr[i] > arr[j]){
swap = arr[j];
arr[j] = arr[i];
arr[i] = swap;}
使用了未声明的变量 swap
。你必须写
if (arr[i] > arr[j]){
int swap = arr[j];
arr[j] = arr[i];
arr[i] = swap;}
其次,我无法获得您显示的输出。如果要编写如上所示的更新程序,则其输出为
0 6 11 12 18 34 45 55 2 99
你的 for 循环的问题是,由于这个 if 语句,只有当 i
等于 n-2
时,数组的最后一个元素才参与算法
if(j==(n-1)){
i++;
j=i+1;
}
在这种情况下,在这个 if 语句之前 j 将等于 n-1
if (arr[i] > arr[j]){
int swap = arr[j];
arr[j] = arr[i];
arr[i] = swap;}
按照以下方式重写您的 for 循环,如下所示在您更新的程序中
#include <stdio.h>
int main() {
int arr[10]={6,2};
int n=10;
int i=0,j;
for (j =i; j <n; ) {
if (arr[i] > arr[j]){
int swap = arr[j];
arr[j] = arr[i];
arr[i] = swap;}
if( ++j== n ){
i++;
j=i+1;
}
}
for (int jj = 0; jj < n; jj++)
printf("%d\t",arr[jj]);
return 0;
}
在这种情况下,程序输出是
0 2 6 11 12 18 34 45 55 99
请注意,您的方法效率低下,因为数组元素有许多冗余交换。
选择排序方法的实现最好使用传统的方式。例如
#include <stdio.h>
void selection_sort( int a[],size_t n )
{
for ( size_t i = 0; i + 1 < n; i++ )
{
size_t min_pos = i;
for ( size_t j = i + 1; j < n; j++ )
{
if ( a[j] < a[min_pos] ) min_pos = j;
}
if ( min_pos != i )
{
int tmp = a[i];
a[i] = a[min_pos];
a[min_pos] = tmp;
}
}
}
int main( void )
{
int a[] = { 6,2 };
const size_t N = sizeof( a ) / sizeof( *a );
selection_sort( a,N );
for ( size_t i = 0; i < N; i++ )
{
printf( "%d\t",a[i] );
}
putchar( '\n' );
return 0;
}
程序输出为
0 2 6 11 12 18 34 45 55 99
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。