冒泡排序很形象,指从数组后面将更小的值慢慢浮到前面去,每遍历一趟使得最小值浮到最前面(指当前位置)。

这里有点小技巧,当某一次遍历过程中发现无交换,则说明此时数组已经排序完成,可提前退出。

时间复杂度:O(n^2)

空间复杂度:O(1)

此处应用了C++11的auto , lambda , static_assert 。

show me the code !

// #if __cplusplus < 201103L
// #error "must be compiled under c++11 support platform!!!"
// #endif
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cassert>
using namespace std; void Swap(int& a, int& b)
{
int tmp = a;
a = b;
b = tmp;
}
void BubbleSort(int varList[], const int size)
{
if (!varList || size <= )
{
return;
}
bool sortedOK = false;
for (int i = ; i < size && !sortedOK; i++)
{
sortedOK = true;
for (int j = size - ; j >= i;j--)
{
if (varList[j-] > varList[j])
{
Swap(varList[j - ], varList[j]);
sortedOK = false;
}
}
}
} void test()
{
//case counter
int testCase = ;
//sort function object
auto sortFunc = BubbleSort;
//show case result lambda function
auto showFunc = [&testCase](const char* caseDescription){cout << "case[" << testCase++ << "]\t(" << caseDescription << ") \t\tok " << endl; }; cout << "test begin : " << endl << endl; //case empty list
{
sortFunc(nullptr, );
showFunc("case empty list");
}
//case wrong size
{
int nTestList[] = { , , , , , , , , , };
sortFunc(nTestList, );
showFunc("case wrong size");
}
//case size == 1
{
int var = ;
int varList[] = { var };
sortFunc(varList, );
assert(var == varList[]);
showFunc("case size == 1");
}
//case normal sort
{
int varList[] = { , , , , , , , , , };
const int size = sizeof(varList) / sizeof(int);
const int resultList[] = { , , , , , , , , , };
static_assert(sizeof(varList) == sizeof(resultList),"size of varList is not equal with resultList!!"); sortFunc(varList, size);
for (int i = ; i < size; i++){ assert(varList[i] == resultList[i]); }
showFunc("case normal sort");
}
//case sorted list
{
int varList[] = { , , , , , , , , , };
const int size = sizeof(varList) / sizeof(int);
const int resultList[] = { , , , , , , , , , };
static_assert(sizeof(varList) == sizeof(resultList), "size of varList is not equal with resultList!!"); sortFunc(varList, size);
for (int i = ; i < size; i++){ assert(varList[i] == resultList[i]); }
showFunc("case sorted list");
}
cout << endl << "test done ! " << endl << endl;
}
int main(int argc, char* argv[])
{
test();
return ;
}

C++11写算法之冒泡排序的更多相关文章

  1. C++11写算法之顺序查找

    从这篇博文起,将尝试使用C++11来写常用算法与数据结构. 本篇博文以最简单的顺序查找作为系列博文的起点,并作约定如下: 1,变量名 : varList : 函数名 : SequentialFind ...

  2. C++11写算法之二分查找

    同样的,二分查找很好理解,不多做解释,要注意二分查找的list必须是排好序的. 这里实现了两种二分查找的算法,一种递归一种非递归,看看代码应该差不多是秒懂.想试验两种算法,改变一下findFunc函数 ...

  3. C++11写算法之插入排序

      插入排序,是指将从1 –> size-1的数一个个插入到前面已经排序好的数组中. 时间复杂度:O(n^2) , O(nlgn) (lgn指使用二分查找插入点位置) 空间复杂度:O(1) // ...

  4. C++11写算法之选择排序

    选择排序,顾名思义,指从数组后面将最小的值找出来,然后与最前面(指当前位置)值进行交换. 时间复杂度:O(n^2) 空间复杂度:O(1) 此处应用了C++11的auto , lambda , stat ...

  5. 用Java写算法之归并排序

    转自:http://flyingcat2013.blog.51cto.com/7061638/1281026 前面的三种排序算法(冒泡排序,选择排序,插入排序)在平均情况下均为O(n^2)复杂度,在处 ...

  6. 一步一步写算法(之挑选最大的n个数)

    原文:一步一步写算法(之挑选最大的n个数) [ 声明:版权所有,欢迎转载,请勿用于商业用途.  联系信箱:feixiaoxing @163.com] 从一堆数据中挑选n个最大的数,这个问题是网上流传的 ...

  7. 我的Java开发学习之旅------>Java经典排序算法之冒泡排序

    冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已 ...

  8. m_Orchestrate learning system---二十一、怎样写算法比较轻松

    m_Orchestrate learning system---二十一.怎样写算法比较轻松 一.总结 一句话总结:(1.写出算法步骤,这样非常有利于理清思路,这样就非常简单了 2.把问题分细,小问题用 ...

  9. 排序算法:冒泡排序(Bubble Sort)

    冒泡排序 算法原理 冒泡排序的原理是每次从头开始依次比较相邻的两个元素,如果后面一个元素比前一个要大,说明顺序不对,则将它们交换,本次循环完毕之后再次从头开始扫描,直到某次扫描中没有元素交换,说明每个 ...

随机推荐

  1. 全面了解linux服务器

    一.查看linux服务器CPU详细情况 判断linux服务器CPU情况的依据如下 具有相同core id的CPU是同一个core的超线程 具有相同physical id的CPU是同一个CPU封装的线程 ...

  2. HTML5 canvas图形库 RGraph【转】

    RGraph是一个使用HTML5 Canvas标签实现的图表制作Library.利用该Library生成的Chart具有可交互性,当鼠标点击或移过时会显示相应的信息,可以动态加载Chart或对特殊点进 ...

  3. 深入理解JavaScript中的函数操作——《JavaScript忍者秘籍》总结

    匿名函数 对于什么是匿名函数,这里就不做过多介绍了.我们需要知道的是,对于JavaScript而言,匿名函数是一个很重要且具有逻辑性的特性.通常,匿名函数的使用情况是:创建一个供以后使用的函数.简单的 ...

  4. Android Studio NDK 新手教程(5)--Java对象的传递与改动

    概述 本文主要Java与C++之间的对象传递与取值.包括传递Java对象.返回Java对象.改动Java对象.以及性能对照. 通过JNIEnv完毕数据转换 Java对象是存在于JVM虚拟机中的,而C+ ...

  5. XML之Schema

    前面学习了DTD.相同我们有了一套更完好的定义法则-Schema. 以下环绕Schema是什么.为何用以及怎么用谈谈自己的感受. XML Schema是基于XML的DTD替代者. XML Schema ...

  6. oracle获取时间毫秒数

    select (sysdate-to_date('1970-01-01','yyyy-mm-dd')-8/24)*24*60*60*1000-1* 60 * 60 * 1000  millisecon ...

  7. <转>程序员的心理疾病

    注:本文转自大神王垠的博客 原文出处 http://www.yinwang.org/blog-cn/2014/02/09/programmer-mental/ 说实话,虽然似乎为之奋斗了十多年,在真正 ...

  8. AngularJs学习笔记(2)——ng-include

    编写html文档的时候,为了实现代码模块化,增加复杂页面的代码可读性和可维护性,我们常常会想到将代码分散写入不同的HTML文件 angularJS里面的ng-include指令结合ng-control ...

  9. node.js 学习01

    PHP开发技术栈(LAMP) Linux  Apache  MySql  PHPnode.js 全栈开发技术栈(MEAN): MongoDB  Express  Angular  Node.js 现阶 ...

  10. tcp/ip ---子网寻址

    现在所有的主机都要求支持子网编址( RFC 950 [Mogul and Postel 1985]).不是把I P地址看成由单纯的一个网络号和一个主机号组成,而是把主机号再分成一个子网号和一个主机号. ...