优化的冒泡排序法

分别用数组法和指针法来写冒泡排序,例子中是将大的数字放在后面,首先来看数组法:

#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);            //传入两个参数,一个是数组的地址,一个是数组的长度
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值