往往我们在导代码的时候,会将数组作为参数传个函数,比如我们要实现一个 冒泡排序:函数讲一个整形数组进行排序(主要讲算法思想)
#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]);
}
}
这个就是优化版的冒泡排序。