//冒泡排序,学习数组传参要注意的点和如何优化一段代码
#include
void line(int arr[],int b)
{
//int b=sizeof arr/sizeof arr[0];
for (int i = 0;i
//这里的i应该设置为sz-1,即i只能取到sz-2,此回合j
//如果设置为i
//程序本身不会出错,但最后一次使得flag=0,因此必定打印摸鱼,与我们最初想的“如果程序跑满就跳过摸鱼”相悖,也就是程序逻辑性存在问题
{
//注意数组传参时,不是传整个数组,而是只传数组的第一个元素的地址
//(不过数组本身元素是按顺序排在内存中的,因此调用的话是可以,但不能进行sizeof求长度等操作)
// 在参数中的数组只有首元素一个元素,因此在这里求形参长度必定sz=1;同时程序出错
//因此,如果要使用sz,必须要在主函数中定义并且计算出来传入自定义函数中
int flag = 0;
for (int j = 0;j
//个人感觉i j同向然后作差的健壮性不如逆向
{
if (arr[j] > arr[j + 1])
{
int tem = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = tem;
flag = 1;
}
//在本身程序没有问题的情况下,我们觉得这个程序仍存在缺陷:
//当数组元素已经顺序甚至一开始就是顺序的时候,该程序仍会跑完,低效
//因此,我们引入一个判断的标志flag,当某一趟冒泡排序时没有元素换位-
//-此时数组已顺序,我们让flag变号并且break从而提高效率
}
if (flag == 0)
{
printf(“已经摸完鱼了,老子不干了n”);
break;
}
}
}
int main()
//{
// int a[] = { 2,3,1,4,7,5,6,8,9 };
// //设置了一串数值数组,接下来要对它进行排序
// //为了主函数简约美观,我们将该段功能的实现全放到函数中去,这样我们每次只需要调用函数就可以直接排序而不用其它代码;
// line(a);
// int k = 0, sz = sizeof a / sizeof a[0];
// for (k = 0;k
// printf(“%d “, a[k]);
// return 0;
//}
{
/*int a[] = { 2,3,1,4,7,5,6,8,9 };*/
int a[] = { 1,2,3,4,5,6,7,8,9 };
/*int a[] = { 9,8,7,6,5,4,3,2,1 };*/
int sz = sizeof a / sizeof a[0];
//设置了一串数值数组,接下来要对它进行排序
//为了主函数简约美观,我们将该段功能的实现全放到函数中去,这样我们每次只需要调用函数就可以直接排序而不用其它代码;
line(a,sz);
int k = 0;
for (k = 0;k
printf(“%d “, a[k]);
return 0;
}
逆序更好一点
/*#include
int main()
{
void ch(int* a, int* b);
int a[] = { 2,3,1,7,5,9,6,8,4 };
int sz = (sizeof a / sizeof a[0]);
//for (int i = 0;i
//{
// for (int j = 0;j
// ch(&a[j], &a[j + 1]);
//}
//这种算法对于最后的这个4,只进行了一次排序,因此ij都顺势的递增是不行的;
for (int i = sz – 1;i > 0;i–)
{
for (int j = 0;j
ch(&a[j], &a[i]);
//让i不动,并两者逆序,从右边开始依次编入最大值,确保每跑完一个i,该位置元素就已正确。
}
for(int k=0;k
printf(“%d,”, a[k]);
return 0;
}
void ch(int* a, int* b)
{
if (*a
;
else
{
int c;
c = *a;
*a = *b;
*b = c;
}
}
*/
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.fwqtg.net
相关推荐: 基于 Flink CDC 构建 MySQL 到 Databend 的 实时数据同步
源创会,线下重启!2023年7月1日深圳站—基础软件技术面面谈!免费票限时抢购! 作者:韩山杰 Databend Cloud 研发工程师 https://github.com/hantmachttps://github.com/hantmac 这篇教程将展示如…