双向冒泡排序

以整数升序排序为例来简单说明一下双向冒泡排序的过程:首先从前往后把最大数移到最后,然后反过来从后往前把最小的一个数移动到数组最前面,这一过程就是第一轮,然后重复这一过程,最终就会把整个数组从小到大排列好。双向冒泡排序要稍微优于传统的冒泡排序,因为双向排序时数组的两头都排序好了,我们只需要处理数组的中间部分即可,而单向即传统的冒泡排序只有尾部的元素是排好序的,这时每轮处理都需要从头一直处理到已经排好序元素的前面一个元素。虽然它在效率上有了点改进,但它也不能大幅度提高其排序的效率,这是由冒泡排序的基本过程所决定了的。在此基础上改进了一下,下面的代码可以实现对奇数偶数分别排序:


#include <iostream.h>

#define numLength 10 //数组大小

void bidirectionalTaxis(int numbers[],int n)
{
 bool flag=1; //排序条件

 int temp;

 int zCount=(n-1),fCount=0;//正反数计数初始化

 while(flag)
 {
  //从反数计数点开始 遍历到n-1,即不遍历已反向排好的

  for(int i=fCount;i<zCount;i++) //冒泡法正向遍历找最大值
  {
   if(numbers[i]>numbers[i+1])//前一个数大于后一个数则交换,使得大数冒到后面去
   {
    temp=numbers[i];

    numbers[i]=numbers[i+1];

    numbers[i+1]=temp;
   }
  }

  //从最后一位开始反向遍历到 第一位 ,即不遍历正向已经排好的

  for(int j=zCount-1;j>fCount;j--) //反向遍历,找次大值
  {
   if(numbers[j]>numbers[j-1])//后一个数大于前一个数则交换,使得大数冒到前面去
   {
    temp=numbers[j];

    numbers[j]=numbers[j-1];

    numbers[j-1]=temp;
   }

  }
  if (zCount-1==fCount||zCount==fCount)//退出条件
  {
   flag=0;

   break;// 跳出循环条件,考虑到数组是奇数还是偶数个数
  }

  zCount--;//正数自加,即排好了第zCount+1位数(初始是n)

  fCount++;//反数自加,即排好了第fCount+1位数(初始是1)
 
}
}

void main()
{
 int a[numLength]={2,5,3,4,6,0,9,8,7,1};//要排序数组

 cout<<"双向冒泡排序"<<endl<<"排序前:  ";

 for(int i=0;i<numLength;i++) //遍历A
 {
  cout<<a[i];//输出a[numLength]中的元素
 }
 cout<<endl;//插入一个换行字符

 cout<<"排序后:  ";

 bidirectionalTaxis(a,numLength);

 for(i=0;i<numLength;i++) //遍历A
 {
  cout<<a[i];
 }
 cout<<endl;

 cout<<"反相输出:";

 for(i=numLength-1;i>=0;i--) //遍历A
 {
  cout<<a[i];
 }
 cout<<endl;
}


我在看关于排序的算法时发现几乎每一段代码都用到了cout,由于不明白这是什么意思就查阅了相关书籍,cout译为“控制台输出”,说到底就还是函数调用,不过这个函数有些特殊,用的是运算符重载,确切的说是重载了“<<”运算符。cout是一个iostream类的对象(标准库的设计者们早已经为我们定制了iostream),它有一个成员运算符函数operator<<,每次调用的时候就会向输出设备(一般就是屏幕)输出东西。运算符函数与一般函数基本无异,可以任意重载。
C++的iostream与C的print/scanf相比有如下优势:首先是类型处理更安全、智能,相比之下,printf中对int、float等的”%d””%f”等说明符就有点多余且麻烦了;其次是扩展性更强:如果新定义一个复数类Complex,printf对其无能为力,最多只能分别输出实、虚部,而iostream使用的<<、>>操作符都是可重载的,只要重载相关的运算符就可以了;而且写法也比较自然简洁。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值