我一直得到相同的数字166和74。我试图获取74 166 250 273 441 545 659 710 808 879 924931。我真的不知道在哪里可以找到这个bug。我确实知道main函数是正确的,但是我不确定在哪里可以找到给我166和74的错误。
#include <stdio.h>
// Swap the values pointed to by a and b.
void swap( int *a, int *b )
{
int temp = *a;
*a = *b;
*b = temp;
}
// Return a pointer to the element of the given array with the smallest value.
int *findSmallest( int *list, int len )
{
int *smallest = list;
for ( int i = 1; i < len; i++ ) {
if(*smallest > *(list + i)) {
*smallest = *(list + i);
}
}
return smallest;
}
// Print the contents of the given list.
void printList( int *list, int len )
{
while ( len ) {
len--;
printf("%d ", *(list + --len));
}
printf( "\n" );
}
int main()
{
// A list of random-ish values.
int list[] = { 808, 250, 74, 659, 931, 273, 545, 879, 924, 710, 441, 166 };
int len = sizeof( list ) / sizeof( list[ 0 ] );
// For each index, find the smallest item from the remaining
// (unsorted) portion of the list.
for ( int i = 0; i < len; i++ ) {
int *p = findSmallest( list + i, len - i );
// Swap the smallest item into the first position in the unsorted part of the
// list.
swap( list + i, p );
}
printList( list, len );
}
}
答案 0 :(得分:3)
len--;
printf("%d ", *(list + --len));
您要递减两次len
。
...但是主要问题是findSmallest
中的这一行:
*smallest = *(list + i);
此处smallest
指向列表中的一个元素,而您覆盖该元素。相反,您应该更改smallest
本身,使其指向另一个元素:
smallest = (list + i);
使用这两个修复程序,输出如下:
931 924 879 808 710 659 545 441 273 250 166 74
该列表已正确排序并从背面打印。
答案 1 :(得分:0)
此代码:
int *findSmallest( int *list, int len )
{
int *smallest = list;
for ( int i = 1; i < len; i++ ) {
if(*smallest > *(list + i)) {
*smallest = *(list + i);
}
}
应该调用swap()
,因此位置列表[0]中的原始值不会重叠在以下语句中:*smallest = *(list + i);