冒泡排序
1、简介
排序过程中,所有元素朝各自最终位置亦步亦趋的移动过程,犹如气泡在水中的上下沉浮,冒泡排序(bubblesort)算法也因此得名。
2、代码
代码如下:
template<class T>
int BubbleSort(T *aArray, int aCount)
{
if(0 == aCount || NULL == aArray)
return sERROR;
bool sortFlag = false; //排序标志,初始化为false
while(!sortFlag)
{
sortFlag = true; //假设排序完成
for(int i = 0; i < aCount - 1; i ++) //从左向右检查aArray[0]-aArray[n-1]内的相邻元素
{
if(aArray[i] > aArray[i + 1]) //若aArray[i]>aArray[i + 1],交换
{
swap(aArray[i], aArray[i + 1]);
sortFlag = false;
}
}
aCount--; //一轮遍历结束,得到最大的数值在最右边。因此缩短遍历的长度。
}
return sSUCCESS;
}
1、由于需要对不同数据类型的内容进行排序,所以使用了C++的template模板。
2、函数开始会判断排序的数组以及数组的长度。
3、设置标志位,赋值为false。后续以标志位的值来判断整个数组是否排序完成。
4、从左往右比较两个相邻的元素,把数值大的元素移动到右边。一趟下来,在最右边的数值就是数组中最大的数值。
5、由于数组中最大的数值已经在最右边了,所以将数组的长度-1,缩短需要遍历的长度,缩短时间。
3、引用
使用方法如下:
int main(int argc, char ** argv)
{
int iArray[] = { 49,38,65,97,76,13,27,49,10 };
int iSize = sizeof(iArray) / sizeof(int);
cout <<"排序前:"<<endl;
PrintArray(iArray, iSize);
BubbleSort(iArray, iSize);
cout <<"排序后:"<<endl;
PrintArray(iArray, iSize);
double dArray[] = { 12.3,90.0,123.44,22.5,99.4,34.6,23.3,78.5,20.0 };
int dSize = sizeof(dArray) / sizeof(double);
cout <<"排序前:"<<endl;
PrintArray(dArray, dSize);
BubbleSort(dArray, dSize);
cout <<"排序后:"<<endl;
PrintArray(dArray, dSize);
return sSUCCESS;
}
1、第一部分为int类型的数组排序。
2、第二部分位double类型的数组排序。
4、总结
起泡排序算法的不变性和单调性可分别概括为:经过k趟扫描交换之后,最大的前k个元素必然就位;经过k趟扫描交换之后,待求解问题的有效规模将缩减至n-k;
5、git地址如下
https://github.com/FengAfra/WorkSpace/tree/dev/Arithmetic/BubbleSort