持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第4天,点击查看活动详情
前言
初学排序的人通常会有一些问题
什么是排序?
排序就是将一组杂乱无章的数据按一定的规律顺次排列起来。
排序的目的是什么?
便于查找
排序算法的好坏如何衡量?
- 时间效率——排序速度(即排序所花费的全部比较次数)
- 空间效率——占内存辅助空间的大小
- 稳定性———若两个记录A和B的关键字值相等,但排序后A、B 的先后次序保持不变,则称此排序算法是稳定的
插入排序
插入排序的基本思想是:每步将一个待排序的对象,按其关键码大小,插入到前面已经排好序的一组对象的适当位置上,直到对象全部插入为止。
插入排序有多种具体实现算法:
- 直接插入排序
- 折半插入排序
- 表插入排序
- 希尔插入排序
主要使用的时直接插入排序和希尔插入排序
直接插入排序
直接插入排序是最简单的排序方法
具体的实现步骤是:从前向后遍历元素,在已形成的有序表中线性查找,在合适位置插入。
T=(13,6,3,31,9,27,5,11)
排序过程如下:
时间复杂度:O(n2) 空间复杂度:O(1) 算法的稳定性:稳定
代码实现:
void Insertsort()
{
int i,j;
for(i=2;i<=N;i++){
p[0]=p[i];
j=i-1;
while(p[0] < p[j]){
p[j+1]=p[j];
j--;
}
p[j+1]=p[0];
}
}
希尔排序
排序方式:先将整个待排记录序列分割成若干子序列,分别进行直接 插入排序,待整个序列中的记录“基本有序”时,再对全体记录进行一次直接插入排序。
注意:子序列的构成不是简单地“逐段分割”,而是将相隔某个 增量dk的记录组成一个子序列,让增量dk逐趟缩短(例如依 次取5,3,1),直到dk=1为止。
后记
接下来的几天里会写几篇文章一起总结排序算法。