1.插入排序
如动图所示
从数组第一个数开始,加入数组前面的一个数,将加入的数与前面的比较如果,如果这个数比前面的数要小,这两个数的数值交换,如果比前面的数值要大那么就停止交换。将数组下一个数加入到其中继续进行比较交换。。。。。。一直到数组里没有数据可以进行交换那么这个排序就完成了
代码实现
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void InsertSort(int* a, int n)
{
for (int i = 0; i < n-1; i++)
{
int end = i;
while (end >= 0)
{
if (a[end] > a[end + 1])
{
swap(&a[end], &a[end + 1]);
end--;
}
else
{
break;
}
}
}
}
2.希尔排序
希尔排序就是插入排序的优化
假设一个这样的数组,如果使用插入排序,那么它的排序逻辑就是这样的,如下图所示。
每个插入进来的数值都要在数组中完全遍历一遍才结束,那么这种方式的效率就太低了。
而希尔排序就是在插入排序之前先将数组进行预处理(尽量将较大的数值放入数组的后面)然后再一次进行插入排序。这样插入排序的效率就大大提升这就是希尔排序。
将间隔为3的数值进行插入排序,完成之后再将整个数组进行插入排序就完成了希尔排序。
代码实现
void swap(int* a, int* b)
{
int temp = *a;
*a = *b;
*b = temp;
}
void ShellSort(int* a, int n)
{
int gap = n - 1;
while (gap>0)
{
for (int begin = 0; begin < gap; begin++)
{
for (int end = begin+gap; end < n; end=end+gap)
{
int end1 = end;
while (end1>0 && a[end1]<a[end1-gap])
{
swap(&a[end1], &a[end1 - gap]);
end1 = end1 - gap;
}
}
}
gap = gap / 2;
}
}