一、冒泡排序
此处以一个程序作为例子来进行演示:
//假设进行升序排序
#include<stdio.h>
int main()
{
int i,j;
int arr[] = { 9,8,7,4,5,6,1,2,3,0 };//数组中有10个元素
for (i = 0; i < 9; i++)//i<9进行解释①
{
for (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<9的解释
此处的i几位冒泡排序进行的趟数。数组中共有10个元素,我们称每进行一次从头到尾的冒泡排序(两个相邻元素间进行比较交换(如上arr[j]>arr[j+1]))为一趟冒泡排序。那么当进行完第一趟冒泡排序后数组中最大的数就处于数组的最后一个元素了,以此类推,进行接下来的趟数排序,现在来思考共需要进行几趟冒泡排序:不难得出,当进行完第9趟排序后,数组中最小的数已经处于数组中第一个元素的位置。由此可知,假设数组中数的个数为(n){此处的n也可由操作符sizeof计算},那么共需要进行(n-1)趟冒泡排序,即可将所有的元素升序排列了!
②、j<9-i的解释
此处的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啦
二、冒泡排序写在函数中
1、自定义bubble_sort函数
同样采用上述代码,对其写入函数:
//继续以此程序来进行解释:
#include<stdio.h>
void bubble_sort(int arr[],int sz)//参数类型解释②
{
for (i = 0; i < sz-1; i++)
{
for ( j = 0; j <sz-1-i; j++)
{
if (arr[j] > arr[j + 1])
{
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
}
}
int main()
{
int i,j;
int arr[] = { 9,8,7,4,5,6,1,2,3,0 };
int sz = sizeof(arr) / sizeof(arr[0]);//变量sz位置及计算注意事项①
bubble_sort(arr,sz);//参数类型解释②
for (int i = 0; i < 10; i++)//输出交换后的数组
{
printf("%d ", arr[i]);
}
return 0;
}
①、变量sz位置及计算注意事项
首先是sz变量含义,计算出数组中元素的个数(数组的总大小初一数组中一个元素的大小)。注意事项:1.sz的位置不应放入bubble_sort函数中,在这里我们应当注意数组作为参数传递到bubble_sort函数中时是地址传递,若在函数中计算sz,实际上是计算了一个指针变量的大小除以一个整型的大小,其结果恒为一,明显错误了。因此在程序中应当将sz在bubble_sort函数外的主函数中计算出后将其作为一个参数传递给bubble_sort函数。
②、参数类型解释
1.数组作为函数参数,其传递类型为指针传递*;2.整型sz注意事项(参照①)