首页 > 其他分享 >数组作为函数参数(冒泡排序)

数组作为函数参数(冒泡排序)

时间:2023-11-27 20:31:42浏览次数:31  
标签:sz arr int 冒泡排序 函数参数 数组 sizeof

往往我们在导代码的时候,会将数组作为参数传个函数,比如我们要实现一个 冒泡排序:函数讲一个整形数组进行排序(主要讲算法思想)

#include<stdio.h>
void bubble_sort(int arr[],int sz)
{
  int i=0;//确认冒泡函数的趟数
  //int sz=sizeof(arr)/sizeof(arr[0]);
  //注:这里不能在void函数中算sz
  for(i=0;i<sz-1;i++)
  {
    int j=0;
    for(j=0;j<sz-1-i;j++)
    {
      if(arr[j]<arr[j+1])
      {
        int tmp=arr[j];
        arr[j]=arr[j+1];
        arr[j+1]=tmp;
      }
    }
  }
}
int main()
{
  int arr[]={0,1,2,3,4,5,6,7,8,9};
  //给arr排成降序
  //arr是数组,我们对数组传参时,实际上是数组arr首元素的地址&arr[0]
  int i=0;
  int sz=sizeof(arr)/sizeof(arr[0]);
  bubble_sort(arr,sz);
  for(i=0;i<sz;i++)
  {
    printf("%d ",arr[i]);
  }
}

其中有一步涉及传值调用与传址调用的知识:

int arr[]={0,1,2,3,4,5,6,7,8,9};
//给arr排成降序
//arr是数组,我们对数组传参时,实际上是数组arr首元素的地址&arr[0]
int i=0;
int sz=sizeof(arr)/sizeof(arr[0]);
bubble_sort(arr,sz);

sz的值应该传递在实际参数中传递过去,而非在形式参数中直接计算。

:但其实上面的冒泡函数效率非常低,比如对着一组数字arr[]={2,1,3,4,5,6,7,8,9,10},若要排成升序,只需要第一个元素与第二个元素换位置,但如果还是以上边的方法会慢很多。

所以可以进行改进:

#include<stdio.h>
void bubble_sort(int arr[],int sz)
{
  int i=0;
  for(i=0;i<sz-1;i++)
  {
    int flag=0;//假设这一趟要排的数据已经有序
    int j=0;
    for(j=0;j<sz-1-i;j++)
    {
      if(arr[j]<arr[j+1])
      {
        int tmp=arr[j];
        arr[j]=arr[j+1];
        arr[j+1]=tmp;
        flag=0;//本趟排序的数据其实不完全有序
      }
    }
    if(flag==1)
    {
      break;
    }
  }
}
int main()
{
  int arr[]={0,1,2,3,4,5,6,7,8,9};
  int i=0;
  int sz=sizeof(arr)/sizeof(arr[0]);
  bubble_sort(arr,sz);
  for(i=0;i<sz;i++)
  {
    printf("%d ",arr[i]);
  }
}

这个就是优化版的冒泡排序。












标签:sz,arr,int,冒泡排序,函数参数,数组,sizeof
From: https://blog.51cto.com/u_16351083/8588298

相关文章

  • 排序算法之冒泡排序优化1
    一:概述原始的数列{4,8,6,3,9,2,1,7},执行至第6步和第7步时,数列状态如下:很明显的可以看出,经过第6轮排序之后,整个数列已然是有序的了。可是排序算法依然是继续执行第7轮排序。在这种情况下,如果能判断出数列已经有序,并作出标记,那么剩下的几轮就不必执行了,可以提前结束。二:具体代码优化的......
  • 907. 子数组的最小值之和(贡献法,单调栈,前后缀分解)
     题目不难,但是涉及到的知识点很丰富。classSolution:defsumSubarrayMins(self,arr:List[int])->int:MOD=10**9+7n=len(arr)pre=[-1]*nsuf=[n]*nstk=[]foriinrange(n):w......
  • 数组中每个分成一组展示
    今天公司有这么个需求需要把一个数组分成多个[1,2,3,4,5,6,7,8,9,10]这种数据然后分成每4个一组(我觉得没啥问题但是产品说不好看要我分一下)letlist=[1,2,3,4,5,6,7,8,9,10]letlen=list.lengthletnewList=[]if(len){varc......
  • S数组已经有42个方法
    前言数组在js中作为一个非常重要的类型之一,在对数据处理,存储数据,条件渲染的时候经常会用到,所以随着ES的不断更新,数组的方法也是越来越多,也让我们使用数组对数据操作的时候,越来越简单,但是不经意间,数组的方法已经有42个之多,接下来让我们看看有哪些数组方法从出来就你还没用过......
  • 【Cxx 20】使用 std::span 代替数组指针传参
    我们知道std::string_view可以创建std::string的一个视图,视图本身并不拥有实例,它只是保持视图映射的状态。在不修改实例的情况下,使用std::string_view会让字符串处理的性能大幅提升。实际上,对于那些连续的序列对象我们都可以创建这样一份视图,对于std::vector这样的对象可以提高某......
  • 数组小结
    数组的四个基本特点其长度是确定的,数组一旦被创建,它的大小就是不可以改变的,如果越界则报错其元素必须是相同类型,不允许出现混合类型数组中的元素可以是任何数据类型,包括基本类型和引用类型数组变量属于引用类型,数组可以看成是对象,因此数组无论保存原始类型还是其他对象类型,数组对......
  • 二维数组
    多维数组可以看成是数组的数组,比如二维数组就是一个特殊的一维数组,其每一个元素都是一个一维数组语法:inta[][]=newint[4][5];以上二维数组a可以看成一个两行五列的数组publicclassDemo02{publicstaticvoidmain(String[]args){int[][]a={{1,2},{2,3},......
  • 数组的声明和创建
    首先必须声明数组变量,才能在程序中使用数组。下面是声明数组变量的语法:数据类型[]数组名;//首选数据类型数组名[];//效果相同Java语言使用new操作符来创建数组,语法如下:数组名=new之前声明的数据类型[定义数组大小]。数组的元素是通过下标访问的,数组索引从0开始获取字符串或数组......
  • 排序算法之冒泡排序1
    一概述在生活中,我们离不开排序。例如在学校站队时,会按照身高顺序进行排队。每一个月考或者期末的成绩都会按照成绩排名次。在编程学习中,我们也会经常遇到排序的问题。这种排序的场景非常多。例如在开发一个学生管理系统时,需要按照学号的顺序从小到大去排列。当开发一个电商平台时,需......
  • Java learning Day2 常量 变量 运算符 Scanner 方法 数组
    常量:字面值常量(直接写值的常量)+自定义常量变量:long型变量后必须加L;小数字面值常量默认double 若用float需加F;变量强转:小的会自动转成大的float虽然只有4个字节但是比所有整型的取值范围都大    浮点型有精度问题  表达式类型提升:如果表达式当中存在多种数......