来源自我的博客
http://www.yingzinanfei.com/2017/04/01/geleipaixusuanfashengchengyuceshiyanglidaima/
#include <iostream>
#include <vector>
#include <random>
#include <algorithm>
#include <functional>
#include <string>
#include <map>
#include <unordered_map>
#include <cassert>
using namespace std;
const int maxn = 1000; // 生成多少个数
const int max_range = 100000; // 生成的数的范围0~max_range
void initNums(vector<int>& nums) {
// 初始化随机数数组
uniform_int_distribution<int> u(0, max_range);
default_random_engine e;
nums.assign(maxn, 0);
for (auto& num : nums) {
num = u(e);
}
}
/***********************************************************
* 直接插入排序
***********************************************************/
void directInsertSort(vector<int>& nums) {
for (unsigned i = 1; i < nums.size(); i++) {
// 依次将nums[1]~nums[n-1]插入到前面已排序序列
if (nums[i] < nums[i - 1]) {
// 当前元素需要往前插时
int num = nums[i]; // 暂存当前元素
int j; // 向前遍历的索引
for (j = i - 1; j >= 0 && num < nums[j]; j--) {
nums[j + 1] = nums[j]; // 后移比当前元素大的元素
}
// 填充当前元素到合适位置,因为退出循环时j指向的元素是比当前元素小的,所以要赋值给下一个元素
nums[j + 1] = num;
}
}
}
/***********************************************************
* 二分插入排序
***********************************************************/
void binaryInsertSort(vector<int>& nums) {
for (unsigned i = 1; i < nums.size(); i++) {
// 依次将nums[1]~nums[n-1]插入到前面已排序序列
if (nums[i] < nums[i - 1]) {
// 当前元素需要往前插时
int num = nums[i]; // 暂存当前元素
int low = 0, high = i - 1; // 折半查找的范围
while (low <= high) {