目录
前言:
插入排序:
希尔排序:
前言:
排序在我们生活中无处不在,比如学生成就排名,商品价格排名等等,所以排序在数据结构的学习中尤为重要,今天就为大家介绍两个经典的排序算法:插入排序和希尔排序。
插入排序:
思路图:
思路:
从第二个元素开始和前面的元素依次比较,如果前面的元素比它大,则将该元素移到后一位,如果该元素比它小,则直接插入该元素后面。
代码实现:
void InsertSort(int* a, int n)
{
int i = 0;
for (i = 0;i < n-1;i++)
{
int end = i;
int tmp = a[end + 1];
while (end >= 0)
{
if (a[end] > tmp)
{
a[end + 1] = a[end];
end--;
}
else
{
break;
}
}
a[end + 1] = tmp;
}
}
时间复杂度:
最坏情况下为O(N*N),此时待排序列为逆序,或者说接近逆序
最好情况下为O(N),此时待排序列为升序,或者说接近升序。
空间复杂度:O(1)
希尔排序:
其实希尔排序就是插入排序的进阶版,可以说是希尔对插入排序进行了优化。
思路图:
思路:
步骤一:预排序,使数组接近有序
步骤二:插入排序
先将每间隔gap个元素的数据分为一组,将每组分别进行插入排序,使其接近有序
gap逐渐减小,gap减为1时就是进行步骤二的插入排序。
代码实现:
void ShellSort(int* a, int n)
{
int gap = n;
while(gap>1)
{
gap = gap / 2;
int i = 0;
for (i = 0;i < n - gap; i++)
{
int end = i;
int tmp = a[end + gap];
while (end >= 0)
{
if (a[end] > tmp)
{
a[end + gap] = a[end];
end -= gap;
}
else
{
break;
}
}
a[end + gap] = tmp;
}
}
}
纸上得来终觉浅,绝知此事要躬行。快去实践一下吧。