当我硬编码一个非零最小值时,为什么我的选择排序会失败?
Why does my selection sort fail when I hardcode a non-zero minimum value?
当我在进入循环处理数组之前指定 min = arr[0]
时,我的代码没有成功执行选择排序,它失败了。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[11] = {7, 12, 4, 28, 3, 15, 7, 3, 89, 1, 12};
int x, i, next_index;
/* Select first element (i = 0) first for loop and compare it with all
elements of array till the end of array second for loop (so next
iteration, when i = 1 the first element will be the smallest one */
for (i = 0; i <= 10; i++)
{
// min = arr[0]; /* <-- WHEN I UNCOMMENT THIS THE CODE FAILS. WHY? */
/* Select min element */
for (next_index = i + 1; next_index <= 10; next_index++)
{
if (arr[next_index] < arr[i])
{
/* Swap arr[i] with min value */
x = arr[i];
arr[i] = arr[next_index];
arr[next_index] = x;
}
}
}
printf("Sorted array: \n");
for (i = 0; i <= 10; i++)
printf(" %d \n", arr[i]);
return 0;
}
第二个代码无法正常工作,因为您没有正确交换值。其次,赋值 min = arr[0] 的逻辑是行不通的,逻辑上是错误的。您可能需要像 min = arr[i] 这样正确地交换值。
对于初学者来说,这两种方法都是低效的,因为存在数组元素的冗余交换。
在第二个程序中而不是在外循环体中使用语句
min=arr[i];
您正在使用
min=arr[0];
在这个循环中
printf("sorting array is : \n");
for(i=0;i<=10;i++)
{
printf(" %d \n",min); // as i put value of min in i
}
您总是在对数组进行排序的循环之外输出变量 min
的最后一个值。
.
使用像 10
.
这样的幻数也是一个坏主意
并且您应该在使用它们的最小范围内声明变量。
程序可以这样看
#include <stdio.h>
int main( void )
{
int arr[] = { 7, 12, 4, 28, 3, 15, 7, 3, 89, 1, 12 };
const size_t N = sizeof( arr ) / sizeof( *arr );
printf( "Unsorted array: " );
for ( size_t i = 0; i < N; i++ )
{
printf(" %2d ", arr[i] );
}
putchar( '\n' );
for ( size_t i = 0; i < N; i++ )
{
size_t min_i = i;
for ( size_t j = i + 1; j < N; j++ )
{
if ( arr[j] < arr[min_i] ) min_i = j;
}
if ( min_i != i )
{
int tmp = arr[i];
arr[i] = arr[min_i];
arr[min_i] = tmp;
}
}
printf( "sorted array: " );
for ( size_t i = 0; i < N; i++ )
{
printf(" %2d ", arr[i] );
}
putchar( '\n' );
return 0;
}
它的输出是
Unsorted array: 7 12 4 28 3 15 7 3 89 1 12
sorted array: 1 3 3 4 7 7 12 12 15 28 89
当我在进入循环处理数组之前指定 min = arr[0]
时,我的代码没有成功执行选择排序,它失败了。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int arr[11] = {7, 12, 4, 28, 3, 15, 7, 3, 89, 1, 12};
int x, i, next_index;
/* Select first element (i = 0) first for loop and compare it with all
elements of array till the end of array second for loop (so next
iteration, when i = 1 the first element will be the smallest one */
for (i = 0; i <= 10; i++)
{
// min = arr[0]; /* <-- WHEN I UNCOMMENT THIS THE CODE FAILS. WHY? */
/* Select min element */
for (next_index = i + 1; next_index <= 10; next_index++)
{
if (arr[next_index] < arr[i])
{
/* Swap arr[i] with min value */
x = arr[i];
arr[i] = arr[next_index];
arr[next_index] = x;
}
}
}
printf("Sorted array: \n");
for (i = 0; i <= 10; i++)
printf(" %d \n", arr[i]);
return 0;
}
第二个代码无法正常工作,因为您没有正确交换值。其次,赋值 min = arr[0] 的逻辑是行不通的,逻辑上是错误的。您可能需要像 min = arr[i] 这样正确地交换值。
对于初学者来说,这两种方法都是低效的,因为存在数组元素的冗余交换。
在第二个程序中而不是在外循环体中使用语句
min=arr[i];
您正在使用
min=arr[0];
在这个循环中
printf("sorting array is : \n");
for(i=0;i<=10;i++)
{
printf(" %d \n",min); // as i put value of min in i
}
您总是在对数组进行排序的循环之外输出变量 min
的最后一个值。
.
使用像 10
.
并且您应该在使用它们的最小范围内声明变量。
程序可以这样看
#include <stdio.h>
int main( void )
{
int arr[] = { 7, 12, 4, 28, 3, 15, 7, 3, 89, 1, 12 };
const size_t N = sizeof( arr ) / sizeof( *arr );
printf( "Unsorted array: " );
for ( size_t i = 0; i < N; i++ )
{
printf(" %2d ", arr[i] );
}
putchar( '\n' );
for ( size_t i = 0; i < N; i++ )
{
size_t min_i = i;
for ( size_t j = i + 1; j < N; j++ )
{
if ( arr[j] < arr[min_i] ) min_i = j;
}
if ( min_i != i )
{
int tmp = arr[i];
arr[i] = arr[min_i];
arr[min_i] = tmp;
}
}
printf( "sorted array: " );
for ( size_t i = 0; i < N; i++ )
{
printf(" %2d ", arr[i] );
}
putchar( '\n' );
return 0;
}
它的输出是
Unsorted array: 7 12 4 28 3 15 7 3 89 1 12
sorted array: 1 3 3 4 7 7 12 12 15 28 89