main.cc
/*-----------------------------------------------
Created By EverSteins
Email:EverSteins@gmail.com
转载请注明出处
------------------------------------------------*/
#include "stdafx.h"
#include <iostream>
using namespace std;
bool BubbleSort1(int *arr,int n) //非主流非常规版本,从上往下“冒”。。。效果等同于BubbleSort2
{
if (n<=0)
return false;
for (int i=0;i<n-1;++i)
{
for (int j=0;j<n-1-i;++j)
{
if (arr[j+1]<arr[j])
{
int tmp=arr[j+1];
arr[j+1]=arr[j];
arr[j]=tmp;
}
}
}
return true;
}
bool BubbleSort2(int *arr,int n) //常规版本,从下往上冒
{
if (n<=0)
return false;
for (int i=0;i<n-1;++i)
{
for (int j=n-1;j>i;--j)
{
if (arr[j]<arr[j-1])
{
int tmp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=tmp;
}
}
}
return true;
}
bool BubbleSort3(int *arr,int n) //优化版冒泡算法
{
if (n<=0)
return false;
bool flag=true; //flag充当标记
for (int i=0;i<n-1 && flag;++i) //flag为false则退出循环
{
flag=false;
for (int j=n-1;j>i;--j)
{
if (arr[j]<arr[j-1])
{
int tmp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=tmp;
flag=true; //如比较成功,则移动元素,flag为true,继续大循环
}
}
}
return true;
}
bool BubbleSort4(int *arr,int n) //最优版冒泡算法
{
if (n<=0)
return false;
bool flag; //flag充当标记
for (int i=0;i<n-1;++i) //flag为false则退出循环
{
flag=false;
for (int j=n-1;j>i;--j)
{
if (arr[j]<arr[j-1])
{
int tmp=arr[j];
arr[j]=arr[j-1];
arr[j-1]=tmp;
flag=true; //如比较成功,则移动元素,flag为true,继续大循环
}
}
if (!flag) //比起BubbleSort3其实就是少了进入循环前一次初始没必要的flag判断,性能和BubbleSort3相同(只是少了1次比较)
break;
}
return true;
}
void ShowArray(int *arr,int n)
{
for (int i=0;i<n;++i)
cout<<arr[i]<<' ';
cout<<endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
int arr[]={27,-94,36,0,-102};
ShowArray(arr,sizeof(arr)/sizeof(arr[0]));
//BubbleSort1(arr,sizeof(arr)/sizeof(arr[0]));
//BubbleSort2(arr,sizeof(arr)/sizeof(arr[0]));
BubbleSort3(arr,sizeof(arr)/sizeof(arr[0]));
ShowArray(arr,sizeof(arr)/sizeof(arr[0]));
cin.get();
return 0;
}