分别用数组法和指针法来写冒泡排序,例子中是将大的数字放在后面,首先来看数组法:
#include<stdio.h>
void main(){
int i,j,temp;
int arr[]={14,25,90,42,28,76};
int len=sizeof(arr)/sizeof(arr[0]); //计算数组长度
bool flag;
for(i=0;i<len-1;i++) // i 表示比较的趟数
{
flag=0;
for(j=0;j<len-1-i;j++) // j 表示每趟比较的次数
{
if(arr[j]>arr[j+1]) //当前一个数字比后一个数字大时,将前后两个数字对调
{
flag=1;
temp=arr[j];
arr[j]=arr[j+1];
arr[j+1]=temp;
}
}
if(flag==0) //当flag=0时,没有进入上面 for 循环中的 if 语句,此时表示顺序已经排好,无需循坏比较,故跳出循环
{
break;
}
}
for(i=0;i<len;i++) //打印输出改变顺序后的数组
{
printf("%d ",arr[i]);
}
}
接下来用指针来写,并且利用函数调用,与数组法基本相同:
#include<stdio.h>
void sort(int* arr,int len)
{
int* p=arr; //定义一个整型的指针变量,使其指向数组首元素地址
for(int i=0;i<len-1;i++) // i 表示比较的趟数
{
bool flag=1;
p=arr;
while(p<arr+len-1-i) //只有指针指在前面没有排好顺序的值时,才进行比较
{
if(*p>*(p+1)) //当前一个数字比后一个数字大时,将前后两个数字对调
{
int temp=*p;
*p=*(p+1);
*(p+1)=temp;
flag=0; //表示该趟循环程序进来过
}
p++;
}
if(flag==1) //当flag=1时,没有进入上面 for 循环中的 if 语句,此时表示顺序已经排好,无需循坏比较,故跳出循环
{
break;
}
}
for(int i=0;i<len;i++) //打印输出改变顺序后的数组
{
printf("%d ",*(arr+i));
}
}
void main()
{
int arr[]={10,50,30,90,20,70,40,80,60};
int len=sizeof(arr)/sizeof(arr[0]); //计算数组长度
sort(arr,len); //传入两个参数,一个是数组的地址,一个是数组的长度
}