排序算法——插入排序
简介
插入排序 ( Insertion - Sort ) 是一种稳定且简单的排序算法,其原理是将未排序部分的元素不断插入至已排序部分的适当位置,当所有未排序元素都被插入至适当位置后,排序完成。这类似于我们打扑克牌时整理牌时的操作。
原理
初始时将元素分为已排序和未排序两部分,首位元素归为已排序部分,其余元素归为未排序部分。以升序为例,将未排序部分的首位元素取出,自后往前依次与已排序部分的元素作比较,若取出的未排序元素比正在比较的已排序元素小,则将该已排序元素往后移一位,否则就将取出的未排序元素插入至空位。一次插入完成后,已排序元素个数 + 1,未排序元素个数 - 1 。当不存在未排序元素时,排序完成。
以序列 2 7 4 5 6 为例,其中蓝底为已排序部分,灰底为未排序部分,红字为插入的元素
代码实现
1 /*---插入排序---*/ 2 #include<stdio.h> 3 int main() 4 { 5 int n,a[50];//n是元素个数 a是数组 6 int i,j;//i,j用于循环遍历 7 8 /*读入元素*/ 9 scanf("%d",&n); 10 for(i=0;i<n;i++) scanf("%d",&a[i]); 11 12 /*插入排序*/ 13 for(i=1;i<n;i++) 14 { 15 int e=a[i];//取出未排序部分的首位元素 16 for(j=i-1;j>=0;j--) 17 { 18 /*升序*/ 19 if(a[j]>e)//降序只需将此处的 > 改成 < 20 a[j+1]=a[j]; 21 else 22 break; 23 } 24 a[j+1]=e;//插入至空位 25 } 26 27 /*输出排序后的元素*/ 28 for(i=0;i<n;i++) printf("%d ",a[i]); 29 return 0; 30 }
稳定性
插入排序过程中元素的移动仅为相邻元素的交换,相同元素的相对位置不会改变,故是稳定的
时间复杂度
假设有 N 个元素,那么就需要 N - 1 次插入操作
最好情况是原本就有序,每次插入比较 1 次,总比较次数为 N - 1 次,此时时间复杂度为 O( N )
最坏情况是原本是逆序,第 i 次插入比较 i 次,总比较次数为
故最坏情况的时间复杂度为 O( N² )