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

 

插入排序,是指将从1 –> size-1的数一个个插入到前面已经排序好的数组中。

时间复杂度:O(n^2) , O(nlgn) (lgn指使用二分查找插入点位置)

空间复杂度:O(1)

// #if __cplusplus < 201103L 

// #error "must be compiled under c++11 support platform!!!"

// #endif

#include <iostream>

#include <algorithm>

#include <iterator>

#include <cassert>

using namespace std;



//find insert position function

int FindInsertPos(int varList[], const int size, const int target)

{

    if (!varList || size < 0)

    {

        assert(false);

        return -1;

    }

    int insertPos = 0;

    for (int i = 0; i < size;i++)

    {

        if (target < varList[i])

        {

            insertPos = i;

            break;

        }

    }

    return insertPos;

}

//binary find insert position function

int BinaryFindInsertPos(int varList[], const int size,const int target)

{

    if (!varList || size < 0)

    {

        assert(false);

        return -1;

    }

    int insertPos = 0;

    int begin = 0;

    int end = size - 1;

    int mid = (begin + end) >> 1;

    while (begin < end)

    {

        if (target > varList[begin] && target <= varList[mid] && 1 == (mid - begin))

        {

            insertPos = mid;

            break;

        }

        else if (target > varList[mid] && target < varList[end] && 1 == (end - mid))

        {

            insertPos = end;

            break;

        }

        else if (target < varList[mid])

        {

            end = mid - 1;

        }

        else if (target > varList[mid])

        {

            begin = mid + 1;

        }

        mid = (begin + end) >> 1;

    }



    return insertPos;

}

//insert sort function

void InsertSort(int varList[], const int size)

{

    if (!varList || size <= 1)

    {

        return;

    }

    auto findInsertPosFunc = BinaryFindInsertPos; //FindInsertPos

    for (int i = 1; i < size; i++)

    {

        if (varList[i - 1] > varList[i])

        {

            int tmp = varList[i];

            int insertPos = findInsertPosFunc(varList, i, varList[i]);

            //move

            for (int j = i; j > insertPos;j--)

            {

                varList[j] = varList[j - 1];

            }

            varList[insertPos] = tmp;

        }

    }

}



void test()

{

    //case counter

    int testCase = 0;

    //sort function object

    auto sortFunc = InsertSort;

    //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, 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;

}

你可能感兴趣的:(插入排序)