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

最新文章

  1. JAVA基础培训(isoft)
  2. 李洪强iOS经典面试题141-报错警告调试
  3. js判断是否是微信浏览器
  4. 用JQuery动态为选中元素添加/删除类
  5. android 进程间通信数据(一)------parcel的起源
  6. hdu2859 dp
  7. IntelliJ IDEA14 配置 SVN
  8. __new__
  9. ./configure会报错:pr command not found
  10. MySql like模糊查询使用详解
  11. CMAKE 学习
  12. Gym 101102C Bored Judge(set--结构体集合)
  13. was类加载器
  14. redis cluster最简配置
  15. 15Linux_DHCP_Postfix_Dovecot_LDAP
  16. html块、含样式的标签
  17. flanneld,flannel和cni逐步深入
  18. Shell脚本编程(三):shell参数传递
  19. (并发编程)进程IPC,生产者消费者模型,守护进程补充
  20. react报错this.setState is not a function

热门文章

  1. eclipse里面配置spring,提示java.lang.ClassNotFoundException:org.springframework.web.servlet.Dispatcher错误
  2. Socket网络通讯开发总结之:Java 与 C进行Socket通讯(转)
  3. SQL查询刚開始学习的人指南读书笔记(一)关系数据库和SQL介绍
  4. Centos 7 修改yum源为阿里源
  5. sql中limit和汇总函数的集合使用
  6. Oracle学习笔记(5)——查询
  7. 解决window10系统电脑插入耳机之后没有声音的问题
  8. tcp/ip --- IP路由选择及子网寻址
  9. 比isConnected()更靠谱的的获取socket实时连接状态!
  10. Atitit.java&#160;反编译&#160;工具&#160;&#160;attilax&#160;总结