如何在C中的冒泡排序函数中保留while循环
How to keep while loop in bubble sort function in C
我正在尝试用 C 编写自己的冒泡排序函数。
正如您在下面的代码中看到的,我试图仅使用 while
/ if
循环来创建此函数。我放了 5 个数字 (1,3,2,5,4)
,所以这个数组的大小是 5,我得到了 5(我用 Python(C)tutor 检查了它。但是,它工作得很好,直到 tab[j]
得到 3。我想弄明白,但无法弄清楚为什么当 tab[j]
得到 3 时它一直熄灭。
有人能解释一下我怎么了吗?我将不胜感激。
下面是我的代码:
#include <stdio.h>
void ft_sort_integer_table(int *tab, int size)
{
int i;
int j;
int tem;
i = 0;
j = 0;
while(tab[i] < size)
{
if(tab[j] > tab[j+1])
{
tem = tab[j];
tab[j] = tab[j+1];
tab[j+1] = tem;
printf("%d ", tab[j]);
j++;
}
else if(tab[j] < tab[j+1])
{
printf("%d ",tab[j]);
j++;
}
i++;
}
}
int main(void)
{
int tab[] = {1,3,2,5,4};
int size = sizeof(tab)/sizeof(*tab);
ft_sort_integer_table(tab, size);
return(0);
}
I'm trying to figure it out, but couldn't figure it out why it keeps
going out when tab[j] get 3.
根据您上面的代码,j 的递增方式与 i 相同。这意味着两个变量将具有相同的值,因为 j 将在 if-then-else 语句之后递增 1,并且 i 也会在每个循环结束时递增 1。因此,tab[j] 引用与 tab[i]
相同的值
话虽如此,while 循环中的布尔条件检查 tab[i] 中的值是否小于 size 的值。
当i == 3, tab[i] == 5 因为在循环中,只有索引小于i的数组中的值是swapped/changed。由于 size 变量的值为 5,tab[i] < size 将导致错误值并退出循环。
可以在此处找到有关冒泡排序的更多信息,https://www.geeksforgeeks.org/bubble-sort/
您的冒泡排序需要一个内部循环,它负责将最大的元素移到后面并执行交换 i
次(这些大元素正在“向上冒泡”)。在每次迭代中从 0
开始内循环并遍历 size - i
(我们知道最后的 i
元素已排序并位于它们的最终位置)。
i
控制你的外部循环,并且应该在循环结束时递增(就像你使用 for
循环一样)。 j
控制内部循环,应在循环结束时递增。
当您使用它时,最好将您的打印移出排序函数,这会导致不必要的 side effect 并且可能会阻碍您的调试工作。
此外,值得一提的是 (1) for
循环在这里在语义上更合适,并且 (2) 通过添加布尔值可以进行优化——只要您通过内部不执行交换的循环,早点结束!
#include <stdio.h>
void ft_sort_integer_table(int *tab, int size)
{
int i = 0, j, tem;
while (i < size)
{
j = 0;
while (j < size - i)
{
if (tab[j] > tab[j+1])
{
tem = tab[j];
tab[j] = tab[j+1];
tab[j+1] = tem;
}
j++;
}
i++;
}
}
int main(void)
{
int tab[] = {1,3,2,5,4,6,7,1,5,6,8,9,1,4,5,1,2};
int size = sizeof(tab) / sizeof(*tab);
ft_sort_integer_table(tab, size);
for (int i = 0; i < size; i++)
{
printf("%d ", tab[i]);
}
return(0);
}
输出:
1 1 1 1 2 2 3 4 4 5 5 5 6 6 7 8 9
我正在尝试用 C 编写自己的冒泡排序函数。
正如您在下面的代码中看到的,我试图仅使用 while
/ if
循环来创建此函数。我放了 5 个数字 (1,3,2,5,4)
,所以这个数组的大小是 5,我得到了 5(我用 Python(C)tutor 检查了它。但是,它工作得很好,直到 tab[j]
得到 3。我想弄明白,但无法弄清楚为什么当 tab[j]
得到 3 时它一直熄灭。
有人能解释一下我怎么了吗?我将不胜感激。
下面是我的代码:
#include <stdio.h>
void ft_sort_integer_table(int *tab, int size)
{
int i;
int j;
int tem;
i = 0;
j = 0;
while(tab[i] < size)
{
if(tab[j] > tab[j+1])
{
tem = tab[j];
tab[j] = tab[j+1];
tab[j+1] = tem;
printf("%d ", tab[j]);
j++;
}
else if(tab[j] < tab[j+1])
{
printf("%d ",tab[j]);
j++;
}
i++;
}
}
int main(void)
{
int tab[] = {1,3,2,5,4};
int size = sizeof(tab)/sizeof(*tab);
ft_sort_integer_table(tab, size);
return(0);
}
I'm trying to figure it out, but couldn't figure it out why it keeps going out when tab[j] get 3.
根据您上面的代码,j 的递增方式与 i 相同。这意味着两个变量将具有相同的值,因为 j 将在 if-then-else 语句之后递增 1,并且 i 也会在每个循环结束时递增 1。因此,tab[j] 引用与 tab[i]
相同的值话虽如此,while 循环中的布尔条件检查 tab[i] 中的值是否小于 size 的值。
当i == 3, tab[i] == 5 因为在循环中,只有索引小于i的数组中的值是swapped/changed。由于 size 变量的值为 5,tab[i] < size 将导致错误值并退出循环。
可以在此处找到有关冒泡排序的更多信息,https://www.geeksforgeeks.org/bubble-sort/
您的冒泡排序需要一个内部循环,它负责将最大的元素移到后面并执行交换 i
次(这些大元素正在“向上冒泡”)。在每次迭代中从 0
开始内循环并遍历 size - i
(我们知道最后的 i
元素已排序并位于它们的最终位置)。
i
控制你的外部循环,并且应该在循环结束时递增(就像你使用 for
循环一样)。 j
控制内部循环,应在循环结束时递增。
当您使用它时,最好将您的打印移出排序函数,这会导致不必要的 side effect 并且可能会阻碍您的调试工作。
此外,值得一提的是 (1) for
循环在这里在语义上更合适,并且 (2) 通过添加布尔值可以进行优化——只要您通过内部不执行交换的循环,早点结束!
#include <stdio.h>
void ft_sort_integer_table(int *tab, int size)
{
int i = 0, j, tem;
while (i < size)
{
j = 0;
while (j < size - i)
{
if (tab[j] > tab[j+1])
{
tem = tab[j];
tab[j] = tab[j+1];
tab[j+1] = tem;
}
j++;
}
i++;
}
}
int main(void)
{
int tab[] = {1,3,2,5,4,6,7,1,5,6,8,9,1,4,5,1,2};
int size = sizeof(tab) / sizeof(*tab);
ft_sort_integer_table(tab, size);
for (int i = 0; i < size; i++)
{
printf("%d ", tab[i]);
}
return(0);
}
输出:
1 1 1 1 2 2 3 4 4 5 5 5 6 6 7 8 9