zoukankan      html  css  js  c++  java
  • C++11写算法之冒泡排序

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

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

    时间复杂度: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 <= 1)
        {
            return;
        }
        bool sortedOK = false;
        for (int i = 0; i < size && !sortedOK; i++)
        {
            sortedOK = true;
            for (int j = size - 1; j >= i;j--)
            {
                if (varList[j-1] > varList[j])
                {
                    Swap(varList[j - 1], varList[j]);
                    sortedOK = false;
                }
            }
        }
    }
    
    void test()
    {
        //case counter
        int testCase = 0;
        //sort function object
        auto sortFunc = BubbleSort;
        //show case result lambda function
        auto showFunc = [&testCase](const char* caseDescription){cout << "case[" << testCase++ << "]	(" << caseDescription << ") 		ok " << endl; };
    
        cout << "test begin : " << endl << endl;
    
        //case empty list
        {
            sortFunc(nullptr, 0);
            showFunc("case empty list");
        }
        //case wrong size
        {
            int nTestList[] = { 13, 52, 32, 15, 66, 2, 99, 202, 103, 2 };
            sortFunc(nTestList, 0);
            showFunc("case wrong size");
        }
        //case size == 1
        {
            int var = 13;
            int varList[] = { var };
            sortFunc(varList, 1);
            assert(var == varList[0]);
            showFunc("case size == 1");
        }
        //case normal sort
        {
            int varList[] = { 13, 52, 32, 15, 66, 2, 99, 202, 103, 2 };
            const int size = sizeof(varList) / sizeof(int);
            const int resultList[] = { 2, 2, 13, 15, 32, 52, 66, 99, 103, 202 };
            static_assert(sizeof(varList) == sizeof(resultList),"size of varList is not equal with resultList!!");
    
            sortFunc(varList, size);
            for (int i = 0; i < size; i++){ assert(varList[i] == resultList[i]); }
            showFunc("case normal sort");
        }
        //case sorted list
        {
            int varList[] = { 2, 2, 13, 15, 32, 52, 66, 99, 103, 202 };
            const int size = sizeof(varList) / sizeof(int);
            const int resultList[] = { 2, 2, 13, 15, 32, 52, 66, 99, 103, 202 };
            static_assert(sizeof(varList) == sizeof(resultList), "size of varList is not equal with resultList!!");
    
            sortFunc(varList, size);
            for (int i = 0; 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 0;
    }
  • 相关阅读:
    GIT的使用
    C# DataTable.Select() 筛选数据
    Oracle数据库使用游标查询结果集所有数据
    清除PLSQL Developer访问数据库连接的历史记录
    C#关于DateTime得到的当前时间的格式和用法
    C++中string的用法
    ACM讲课之字符串
    第二场周赛(递归递推个人Rank赛)——题解
    ACM团队招新赛题解
    线段树详解
  • 原文地址:https://www.cnblogs.com/xylc/p/3681963.html
Copyright © 2011-2022 走看看