目录
插入排序:
注意这里不要将插入排序和冒泡排序弄混:
插入排序是将数据不断放入前一个有序数列:
cpp
// 插入排序
void InsertSort(int* a, int n)
{
for (int j =1; j < n; j++)
{
for (int i = j; i > 0; i--)
{
if (a[i] < a[i - 1])
{
int m = a[i - 1];
a[i -1] = a[i];
a[i] = m;
}
else
{
break;
}
}
}
}
希尔排序:
将插入排序进行多次实现,从高间距到低间距,最后到间距为1的插入排序:
如图我们将具有相同标记的方格记为一组,并分别对不同组进行插入排序,这样就会将序列变得比原来有序,这样不断进行,并不断缩小排序的间距。
这样再次进行排序将会变的更加有序,直到间距为1。间距为1时进行排序将变为插入排序,序列将完全有序。
target为间距
cpp
// 希尔排序
void ShellSort(int* a, int n)
{
int target=n/2;
while (target)
{
for (int m = 0; m < target; m++)//实现多组排序
{
for (int j = m; j < n ; j += target)//单组排序
{
for (int i = j; i > target-1; i -= target)//这里不能是i>0,i-target最小为0
{
if (a[i] < a[i - target])
{
int m = a[i - target];
a[i - target] = a[i];
a[i] = m;
}
else
{
break;
}
}
}
}
target /= 2;
}
}
当然这里我们进行三层循环有一些繁琐,这里我们可以改善成为两层循环:
也就是第一组进行一次插入排序,第二组进行一次插排序........不断前进
cpp
// 希尔排序
void _ShellSort(int* a, int n)
{
int target = n / 2;
while (target)
{
for (int j = 0; j < n; j ++)//递进形式排序
{
for (int i = j; i > target - 1; i -= target)//这里不能是i>0,i-target最小为0
{
if (a[i] < a[i - target])
{
int m = a[i - target];
a[i - target] = a[i];
a[i] = m;
}
else
{
break;
}
}
}
target /= 2;
}
}