我只想在嵌套for循环中解释条件。 如何处理,我有点困惑。我想要两个for循环条件背后的逻辑。
#include<stdio.h>
void bubblesort(int a[25],int n);
int main()
{
int a[25],size,i;
printf("Enter the size of an array");
scanf("%d",&size);
for(i=0;i<size;i++)
{
scanf("%d",&a[i]);
}
bubblesort(a,size);
for(i=0;i<size;i++)
{
printf("%d\t",a[i]);
}
return 0;
}
void bubblesort(int a[], int n)
{
int temp,i,j;
for(i=0;i<n;i++)
{
for(j=0;j<(n-i)-1;j++)
{
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]= temp;
}
}
}
}
答案 0 :(得分:1)
冒泡排序是一种常用的排序整数数组的算法。它被称为&#34;冒泡排序&#34;因为它会导致最大的值,以及#34; bubble&#34;直到阵列的末尾。
冒泡排序一次向一个索引移动数组,基本上拉动最大值。例如,如果数组为[1,3,2]
,则冒泡排序将检查1
并查看它是否大于其前面的值:3
。它不会留在原地。现在3
是程序看到的最大值,因此它会将它与下一个值2
进行比较。 3
更大吗?是!因此,它会切换3
和2
。现在最大的值位于数组的末尾,因此算法再次从数组的开头开始。这将重复,直到整个数组被排序。
关于细节:
第一个for循环for(i=0;i<n;i++)
循环的次数与数组的大小相同,即如果大小为7,则此循环将执行7次。这样做是因为,在最坏的情况下,数组中的每个值都需要更改位置。
最内层的for循环for(j=0;j<(n-i)-1;j++)
首先使j
永远不会到达最后一个数组点,即使i = 0.这是因为循环内的代码{{1 ,总是检查当前索引的一个值AHEAD。因此,if(a[j]>a[j+1])
必须永远不能等于索引的最后一个值,因为会出现一个越界错误。
您还会注意到内部更多for for循环从j
转到0
。包含这个n-i-1
的原因是因为每次执行外循环if(a [j]&gt; a [j + 1])`时,一个值将一直移动到结尾数组。所以你不需要检查数组中的最后一个位置,因为它已经正确了!
<强>摘要强>:
冒泡排序会不断将最大值移动到列表末尾。它通过在向上移动列表并逐步向上移动最大值时不断检查值来实现此目的。
编辑:请参阅Cool Guy的评论,以获取指向冒泡排序的精彩直观表示的链接。