问题描述
我正在尝试创建一个反向冒泡排序算法。它有效,但第一个输出是一个我不明白的疯狂数字。剩余的输出似乎按降序排序。我的代码哪里错了?
#include <stdio.h>
void ft_rev_int_tab(int *tab,int size)
{
int i;
int j;
int k;
i = 0;
while (i < size)
{
j = 0;
while (j < size -i)
{
if (tab[j] < tab[j+1])
{
k = tab[j];
tab[j] = tab[j+1];
tab[j + 1] = k;
}
j++;
}
i++;
}
}
int main(void)
{
int tab[] = {9,320,113,15};
int size = sizeof(tab) / sizeof(*tab);
ft_rev_int_tab(tab,size);
for (int i = 0; i < size; i++)
{
printf ("%d\n",tab[i]);
}
}
解决方法
i = 0;
之前的 while (i < size)
是错误的。当 j < size -i
为零时,条件 j < size
等效于 i
。在这种情况下,j
最多为 size-1
,现在 tab[j+1]
超出范围。
应该改为i = 1;
。
void ft_rev_int_tab(int *tab,int size) {
int i;
int j;
int k;
i = 0;
while (i < size) {
j = 0;
while (j < size - i - 1) {
if (tab[j] < tab[j + 1]) {
k = tab[j];
tab[j] = tab[j + 1];
tab[j + 1] = k;
}
j++;
}
i++;
}
}
您在嵌套 while 循环中的条件应为 (j < size - i - 1)
因为您只需要检查从 tab[0]
到 tab[i-1]
的值。您的 if 和 swap 检查 tab[j]
和 tab[j+1]
,因此当 i
等于数组的大小时,您会将其与数组外的值进行比较。在您的示例中是 tab[5]
的值。