//函数的主要功能实现排序,因此不需要返回值,定义类型为void
void bubble_sort(int arr1[], int a)
{
//排序的次数
int i = 0;
//每一个数比较的次数
int j = 0;
//交换时用到的中间变量
int temp = 0;
for (i = 0; i < a; i++)
{
int sz = sizeof(arr) / sizeof(arr[0]);
以上就可以得出实现排序的大致流程。
void bubble_sort(int arr1[], int a)
{
//排序的次数
int i = 0;
//每一个数比较的次数
int j = 0;
//交换时用到的中间变量
int temp = 0;
//排序的次数
for (i = 0; i < a; i++)
{
int arr[] = {3,1,22,44,5,62,7,84,0,45};
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr, sz-1);
//输出排序后的每一个数
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
3. 重点问题
在主函数内有一串代码,即计算排序的次数,
int sz = sizeof(arr) / sizeof(arr[0]);
这里要明白一点:一般情况下数组名存放的是首元素的地址,放在主函数内计算时算出来的就是数字的个数,但有两种例外:
- sizeof(数组名),这里的数组名存放的是整个数组的地址,计算的是整个数组的长度
- &(数组名),这里的数组名存放的也是整个数组的地址,表示的是整个数组的地址,
因此当我们在主函数内计算 sz 时,就是正常计算出整个数组的长度。
如果我们把上述代码放到调用的函数(bubble_sort)内再进行计算,由于我们实参传递的是首元素的地址,在bubble_sort 内再用sizeof计算,上述代码就变成了首元素长度除以首元素长度,计算出来的值则为1,后面的循环就无法进行了。这是要重点注意的地方
4.代码优化
到此,整个过程就实现完了,最后再思考一下,如果输入的是一个已经完成排序的数组,那还要经过整个循环慢慢计算,整个代码的效率就低了很多,所以再加上一个条件,来判断数组是否是排序完成的数组。
void bubble_sort(int arr1[], int a)
{
//排序的次数
int i = 0;
//每个数比较的次数
int j = 0;
//排序时用到的中间变量
int temp = 0;
//附加的判断条件
int flag = 1;
for (i = 0; i < a-1; i++)
{
/*排序的具体过程,随着排序进行,需要进行的比较次数每次少一次,
即j
for (j = 0; j < a - i; j++)
{
if (arr1[j] > arr1[j + 1])
{
//交换
temp = arr1[j];
arr1[j] = arr1[j + 1];
arr1[j + 1] = temp;
flag = 0;
}
//附加的判断条件
if (1 == flag)
{
break;
}
}
}
}
int main()
{
int arr[] = {3,1,22,44,5,62,7,84,0,45};
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
bubble_sort(arr,sz-1);
//输出排序后的每一个数
for (i = 0; i < 10; i++)
{
printf("%d ", arr[i]);
}
return 0;
}



