冒泡函数
冒泡函数的原理
从数组的第一个元素开始,比较相邻的两个元素。
如果前一个元素大于后一个元素(升序排序),则交换它们的位置。
步骤1和步骤2,直到遍历整个数组。
上步骤,每次遍历都将最大的元素“冒泡”到数组的末尾。
复以上步骤,但不包括已排序的最大元素,直到整个数组排序完成。
如图:
代码展示
//假设进行升序排序
#include<stdio.h>
int main()
{
int arr[] = { 9,8,7,4,5,6,1,2,3,0 };//数组中有10个元素
for (int i = 0; i < 9; i++)//i<9进行解释①
{
for (int j = 0; j < 9-i; j++)//i<9-i进行解释②
{
if (arr[j] > arr[j + 1])//满足条件进行交换
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
for (int i = 0; i < 10; i++)//打印数组,检验排序结果
{
printf("%d ", arr[i]);
}
return 0;
}
//下边对内外循环做解释
外层循环
这里的i几位冒泡排序进行的趟数。数组中共有10个元素,我们称每进行一次从头到尾的冒泡排序(两个相邻元素间进行比较交换(如上arr[j]>arr[j+1]))为一趟冒泡排序。那么当进行完第一趟冒泡排序后数组中最大的几趟冒泡排序:所以我们可以看出当进行完第9趟排序后,数组中最小的数已经处于数组中第一个元素的位置。所以假设数组中数的个数为(n),那么共需要进行(n-1)趟冒泡排序,就可以将所有的元素升序排列了!
内层循环
这里的的j作为交换对数来解释。数组总共有10个元素,两两进行比较交换,那么共需要有九对数进行比较交换(即arr[0]和arr[1]、arr[1]和arr[2]、······依次进行),现在按照程序运行逻辑进行:首先i=0,开始进行第一趟冒泡排序; j<9,数组下标从0-8依次两两进行比较交换(即数组下标:0.1,1.2,2.3,3.4,4.5,5.6,6.7,7.8,8.9)共进行9对数字间的交换,完成后数组中最大的数字就处在数组中最后一个元素的位置,到这里第一趟冒泡排序结束。然后从i=1,开始进行第二趟冒泡排序。此时j<8,数组下标0-7共进行8对(即0.1,1.2,2.3,3.4,4.5,5.6,6.7,7.8)数字间的交换,交换完成后数组中仅比最大数小的一个元素就处在倒数第二个元素的位置啦。依次向后进行,每进行一趟冒泡排序,那么接下来需要进行比较的数对的对数就要减少一对,所以这就是为什么j<9-i.