【发布时间】:2020-07-16 14:12:29
【问题描述】:
我的选择排序成功地对某些数字进行排序,但在某些数字上失败。这段代码对我来说似乎很合乎逻辑,我什至一步一步地打印出来,但不知何故它不起作用。
#include <stdio.h>
#include <string.h>
int number[] = {2, 5, 3, 1};
int length;
void sort(void);
void swap(int *xp, int *yp);
int main(void)
{
length = sizeof(number)/sizeof(number[0]);
for (int i = 0; i < length; i++)
{
printf("%i ", number[i]);
}
printf("\n");
sort();
}
void sort(void)
{
//number
for (int i = 0; i < length - 1; i++)
{
int max = i;
//printf("max:%i\n",max);
for (int j = i + 1; j < length; j++)
{
//printf("max:%i and j: %i\n",number[max], number[j]);
if (number[j] > number[max])
{
max = j;
//SWAP WINNER
swap(&number[max], &number[i]);
}
}
for (int k = 0; k < length; k++)
{
printf("%i ", number[k]);
}
printf("\n");
}
printf("\nnow:\n");
for (int k = 0; k < length; k++)
{
printf("%i ", number[k]);
}
printf("\n");
}
void swap(int *xp, int *yp)
{
int temp = *xp;
*xp = *yp;
*yp = temp;
}
结果:
2 5 3 1
3 2 5 1
3 5 2 1
3 5 2 1
now:
3 5 2 1 ~/ $
无论如何,另一个问题,为什么它必须使用指针?因为没有他们就行不通。有什么建议吗?
【问题讨论】:
-
你不应该在内部循环中交换。在
for(int j=...循环结束后进行交换。 -
哇,成功了!你能告诉我其中的逻辑吗?那么第一次交换怎么可能跳过5号跳到3号
标签: c algorithm sorting selection-sort