插入排序(Insertion Sort)
一般也称为直接插入排序,它的基本思想是将待排序的元素插入到已经有序的序列中,形成新的长度增加1的有序序列,循环直到没有待排序记录为止。
基本思路
- 选择序列中第一个元素作为有序序列
- 将待排序元素和有序序列中元素比较
- 如果满足条件,插入到合适的位置,形成新的有序序列
- 依次走访待排序元素,直到没有待排序元素为止
过程模拟
以此类推,得到排序后的序列
代码实现
void InsertionSort(int a[],int n) { //数组a,数组a的长度n
for(int i=1; i<n; i++) {
int tmp=a[i];//从第2个元素开始提取
int j=i-1;
while(j>=0 && a[j]>tmp){//和已有序序列元素比较
a[j+1]=a[j];//较大元素后移
j--;
}
a[j+1]=tmp;//插入到合适位置
}
}
复杂度
时间复杂度:O(n^2),最好情况下O(n)
空间复杂度:O(1)
稳定性
稳定的排序算法,相同元素排序前后相对位置不会改变
特点
- 对于少量元素的序列比较高效
- 对于局部有序(有序部分越大越好)的序列比较高效