思维导图:
一,插入排序
代码:
void InsertSort(int* a, int n)
{
for (int i = 1;i < n;i++)
{
int end = i-1;
int tmp = a[i];
while (end >= 0)
{
if (tmp < a[end])
{
a[end + 1] = a[end];
end--;
}
else
{
break;
}
}
a[end + 1] = tmp;
}
}
代码分析:
插入排序的时间复杂度
二,希尔排序
代码:单趟
void Shellsort(int* a, int n)
{
int gap = 3;//
for (int i = 0;i < n - gap;i+=gap)
{
int end = i;
int tmp = a[i+gap];
while (end>=0)
{
if (tmp < a[end])
{
a[end+gap] = a[end ];
a[end] = tmp;
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
多趟:
代码:
void Shellsort(int* a, int n)
{
int gap = 3;//
for (int j = 0;j < gap;j++) //加循环
{
for (int i = j;i < n - gap;i += gap)//i随着j变化来控制排序不同的组
{
int end = i;
int tmp = a[i + gap];
while (end >= 0)
{
if (tmp < a[end])
{
a[end + gap] = a[end];
a[end] = tmp;
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
}
两层循环写法:
void Shellsort1(int* a, int n)
{
int gap = 3;//
for (int i = 0;i < n - gap;i++)
{
int end = i;
int tmp = a[i + gap];
while (end >= 0)
{
if (tmp < a[end])
{
a[end + gap] = a[end];
a[end] = tmp;
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
代码:
void Shellsort(int* a, int n)
{
int gap = n;//最大的gap
while (gap > 1) {
gap = gap / 3 + 1;//最小为gap为1
for (int i = 0;i < n - gap;i++)
{
int end = i;
int tmp = a[i + gap];
while (end >= 0)
{
if (tmp < a[end])
{
a[end + gap] = a[end];
a[end] = tmp;
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
}