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

#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]);
  }
}

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