//一次往后走,用此前的数保存下来与与已经有序的前一段区间进行一一比较,升序,比它大,位置往后移,直到比它小,就把该数放到该位置,再往后走。
void InsertSort(vector<int>& A) {
// Write your code here
//insertsort 直接插入排序 时间复杂度是O(n^2) 稳定的排序算法
int i = 0;
for (i = 0; i < A.size()-1; i++)
{
int j = i;
int temp = A[j+1];
for (; j >= 0; j--)
{
if (temp< A[j])
{
A[j + 1] = A[j];
}
else
{
break;
}
}
A[j + 1] = temp;
}
}
//希尔排序也是一种直接插入的思想,不同的是,它将数组划分区间,一组数的间隔为gap,将这组数进行插入排序,再将间隔缩小。是一种不稳定的排序,适合大量数据的排序
void ShellSort(vector<int>& v)//把数组划分成小区间,将小区间进行直接插入排序,每次区间的长度在缩短
{
if (v.empty())
{
return;
}
int gap = v.size();
while (gap > 1)//几趟排序
{
gap = gap / 3 + 1;
for (int i = 0; i < v.size() - gap; i++)//一共分成多少组,并全部扫描到,对每一个组进行直接插入排序
{
int end = i;
int temp = v[end + gap];
while (end >= 0)
{
if (v[end]>temp)
{
v[end + gap] = v[end];
end -= gap;
}
else
{
break;
}
}
v[end + gap] = temp;
}
}
}