排序算法——插入排序

简介

插入排序 ( 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² )

posted @ 2020-08-30 21:41  kentle  阅读(435)  评论(0编辑  收藏  举报