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

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

时间复杂度: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. kvm : Permission denied

    创建虚拟机类型为:“virt type :kvm” 时,会报如下错误: Could not access KVM kernel module: Permission denied failed to ...

  2. Yii2-核心框架代码规范

    1.概述 简单说,我们使用PSR-2兼容规范,所以应用于PSR-2的一切对我们的代码也同样适用. 文件必须使用 <?php 或 <?= 标签. 文件未尾应该有一个新行. PHP代码文件必须 ...

  3. CMA连续物理内存用户空间映射---(二)

    摘要: 相对于上一篇測试程序CMA连续物理内存用户空间映射---(一) 添加功能: 1.分配和映射统一放在IOCTL,一次完毕,能够连续多次分配并映射到用户空间,提高操作性: 2.驱动添加链表,使分配 ...

  4. [TypeScript] Infer the Return Type of a Generic Function Type Parameter

    When working with conditionals types, within the “extends” expression, we can use the “infer” keywor ...

  5. python抓包截取http记录日志

    #!/usr/bin/python import pcap import dpkt import re   def main(): pc=pcap.pcap(name="eth1" ...

  6. activiti designer下载地址

    http://www.activiti.org/designer/update/ http://www.activiti.org/designer/archived/       这个地址貌似不能用了 ...

  7. (转)java 打印自身代码——真实世界不存在自指

    public class SelfPrint {      public static void main(String args[]) {          char s = 34;         ...

  8. Linux 时间修改--date -s命令

    Linux 时间修改 不重启修改时区 一.修改linux的时间root使用date指令:date -s1.只修改日期,不修改时间,输入:Linux代码 1. date -s 2007-08-03 da ...

  9. 我也来谈谈使用Zen Coding快速开发html和css原理

    zen coding 是一种仿css选择器的语法来快速开发html和css的开源项目.现已更名为Emmet.可以到github上下载拜读.在这个都想偷懒的世界里,此方法可以极大的缩短开发人员的开发时间 ...

  10. 轻松学习JavaScript十四:JavaScript的RegExp对象(正則表達式)

    一RegExp对象概述 RegExp对象表示正則表達式,RegExp是正則表達式的缩写.它是对字符串运行模式匹配的强大工具. RegExp 对象用于规定在文本中检索的内容. 当您检索某个文本时.能够使 ...