插入排序,是指将从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;
}

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

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

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

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

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

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

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

  4. C++11写算法之冒泡排序

    冒泡排序很形象,指从数组后面将更小的值慢慢浮到前面去,每遍历一趟使得最小值浮到最前面(指当前位置). 这里有点小技巧,当某一次遍历过程中发现无交换,则说明此时数组已经排序完成,可提前退出. 时间复杂度 ...

  5. 算法分析中最常用的几种排序算法(插入排序、希尔排序、冒泡排序、选择排序、快速排序,归并排序)C 语言版

    每次开始动手写算法,都是先把插入排序,冒泡排序写一遍,十次有九次是重复的,所以这次下定决心,将所有常规的排序算法写了一遍,以便日后熟悉. 以下代码总用一个main函数和一个自定义的CommonFunc ...

  6. 【算法】插入排序 insertion_sort

    准备写个<STL 源代码剖析>的读书笔记,开个专栏.名为<STL 的实现>,将源代码整理一遍.非常喜欢侯捷先生写在封底的八个字:天下大事.必作于细.他在书中写到:"我 ...

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

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

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

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

  9. arcgis api for js共享干货系列之一自写算法实现地图量算工具

    众所周知,使用arcgis api for js实现地图的量算工具功能,无非是调用arcgisserver的Geometry服务(http://localhost:6080/arcgis/rest/s ...

随机推荐

  1. 基于CentOS与VmwareStation10搭建Oracle11G RAC 64集群环境:3.安装Oracle RAC-3.5.安装oracle11gr2 database 软件与创建数据库

    3.5.安装oracle11gr2 database 软件与创建数据库 3.5.1.安装Oracle 11gr2 Database 以oracle 用户登录到节点一,切换到软件安装目录,执行安装. 在 ...

  2. 【转载】tcp窗口滑动以及拥塞控制

    转自:http://blog.chinaunix.net/uid-26275986-id-4109679.html TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥 ...

  3. Uni2D 入门

    原地址:http://blog.csdn.net/kakashi8841/article/details/17599505

  4. C++第4次实验(基础班)—循环结构程序设计

    此次上机中的4个题目项目6.项目7(选1)必做.其他2两题可从剩下的项目中选,也可从项目7中选. [项目1:利用循环求和]求1000以内全部偶数的和(答案:250500) 要求:请编出3个程序来,分别 ...

  5. 【Python3 爬虫】02_利用urllib.urlopen向百度翻译发送数据并返回结果

    上一节进行了网页的简单抓取,接下来我们详细的了解一下两个重要的参数url与data urlopen详解 urllib.request.urlopen(url, data=None, [timeout, ...

  6. 网站相关技术探究keepalive_timeout(转)

    网站相关技术探究keepalive设多少: /proc/$PID/fd/$number  0:标准输入 1:标准输出 2:标准错误   Test: [root@KTQT ~]# ll /proc/12 ...

  7. MATLAB 的数据类型

    在MATLAB中有15种基本的数据类型: 8种整型数据类型.单精度浮点型(float).双精度浮点型(double).逻辑型(logical).字符串型(char).单元数组型(cell).结构体类型 ...

  8. Service(1)

    服务是一个应用组件,能够在后运行耗时的操作,不提供一个用户界面.(由于不提供界面,所以能够耗时运行,和活动最大的不同).还有一个应用组件能够启动一个服务,服务会继续在后台运行及时用户切换到还有一个应用 ...

  9. jQuery select的操作实现代码

          //改变时的事件  $("#testSelect").change(function(){ //事件发生生 jQuery('option:selected', this ...

  10. centos/rhel下实现nginx自启动脚本实例

    1. 建立脚本文件nginxd [root@could]# vi /etc/init.d/nginxd 插入以下内容   #!/bin/bash # # chkconfig: - 85 15 # de ...