排序1.插入排序(直接插入排序)
#include <bits/stdc++.h>
using namespace std;
/* 1、比较
/*2、移动
/* 时间复杂度 最好 O(n) 最坏O(n^2) 平均O(n^2) 稳定排序
/* 空间复杂度 O(1) */
template <typename T>
void inserSort(vector<T> &nums)
{
int len = nums.size();
/*1.1 顺序查找
/*直接插入排序*/
// for (int i = 1; i < len; i++)
// {
// T temp = nums[i];
// int j = i - 1;
// for (; j >= 0 && temp < nums[j]; j--)
// {
// nums[j + 1] = nums[j];
// }
// nums[j + 1] = temp;//注意这是j+1
// }
/*1.2使用哨兵
/*nums[0]是哨兵不参与排序*/
// for (int i = 2; i < len; ++i)//0 上是个哨兵
// {
// if (nums[i] < nums[i - 1])
// {
// nums[0] = nums[i];
// int j = i - 1;
// for (; nums[0] < nums[j]; j--)//使用哨兵的话就是省去了判断j >= 0
// {
// nums[j + 1] = nums[j];
// }
// nums[j + 1] = nums[0];
// }
// }
/*1.3 折半查找 还是O(n^2)
/*使用哨兵 nums[0]是哨兵不参与排序*/
for (int i = 2; i < len; ++i)//0 上是个哨兵
{
if (nums[i] < nums[i - 1])
{
nums[0] = nums[i];
int j = i - 1;
int low = 1;
int high = i - 1;
int mid = (low + high)/2;
while(low <= high)
{
mid = (low + high)/2;
if (nums[0] < nums[mid])
high = mid - 1;
else
low = mid + 1;
}
//high + 1是插入位置(青岛大学) 我觉得mid就是插入位置
// while (j > high)
// {
// nums[j + 1] = nums[j];
// j--;
// }
// nums[high + 1] = nums[0];
while (j >= mid)
{
nums[j + 1] = nums[j];
j--;
}
nums[mid] = nums[0];
}
}
}
//1.4希尔排序 效率与增量序列取值有关(不稳定排序)复杂度约为O(n^(7/6))
//一次移动,移动位置较大,跳跃式地接近排序后的最终位置
//最后一次只需要少量移动
//增量序列必须是递减的,最后一个必须是1
//增量序列应该是互质的
template <typename T>
void ShellIsert(vector<T> &nums, int dk)
{
for (int i = dk + 1; i < nums.size(); i++)
{
if (nums[i] < nums[i - dk])
{
int j = i - dk;
nums[0] = nums[i];//nums[0]是哨兵
for (; nums[0] < nums[j]; j -= dk)//注意这个j = j - dk;
{
nums[j + dk] = nums[j];//没找到比哨兵小的都统统向后移动留出一个位置给哨兵插入
}
nums[j + dk] = nums[0];
}
}
}
template <typename T>
void ShellSort(vector<T>& nums, int dlta[], int t)//dlta[]:增量序列 t:循环趟数 比如 5,3,1就是3趟
{
int len = nums.size();
for (int i = 0; i < t; i++)
{
ShellIsert(nums, dlta[i]);
}
}
int main()
{
vector<int> nums{ -1, 6, 5, 3, 3, 4, 9, 1, 10, 15, 16, 11, 33, 77, 21, 99, 111, 7};
// inserSort(nums);
int dlta[3] = {5, 3, 1};
ShellSort(nums, dlta, 3);
for (auto &x : nums)
cout << x << ", ";
cout << endl;
return 0;
}