Fork me on GitHub

数据结构与算法——十个排序算法之三 · 插入排序

1. 插入排序介绍

插入排序(InsertionSort),一般也被称为直接插入排序。对于少量元素的排序,它是一个有效的算法。插入排序是一种最简单的排序方法,它的基本思想是将一个记录插入到已经排好序的有序表中,从而一个新的、记录数增 1 的有序表。在其实现过程使用双层循环,外层循环对除了第一个元素之外的所有元素,内层循环对当前元素前面有序表进行待插入位置查找,并进行移动。

 

2. 时间复杂度

插入排序的平均时间复杂度也是 O(n^2),空间复杂度为常数阶 O(1),具体时间复杂度和数组的有序性也是有关联的。插入排序中,当待排序数组是有序时,是最优的情况,只需当前数跟前一个数比较一下就可以了,这时一共需要比较 N-1 次,时间复杂度为 O(N)。最坏的情况是待排序数组是逆序的,此时需要比较次数最多,最坏的情况是 O(n^2)。

 

3. 过程演示

假设前面 n-1(其中 n>=2)个数已经是排好顺序的,现将第 n 个数插到前面已经排好的序列中,然后找到合适自己的位置,使得插入第n个数的这个序列也是排好顺序的。按照此法对所有元素进行插入,直到整个序列排为有序的过程,称为插入排序。过程如下:

一个数组:

171 161 163 165 167 169

 

 

1. 首先, 我们只考虑第一个元素,从第一个元素 171 开始,该元素可以认为已经被排序;

171 161 163 165 167 169

 

 

2. 取下一个元素 161 并记录,并让 161 所在位置空出来,在已经排序的元素序列中从后向前扫描;

171   163 165 167 169

 

 

3. 该元素(171)大于新元素,将该元素移到下一位置;

  171 163 165 167 169

 

 

4. 171 前已经没有最大的元素了, 则将 161 插入到空出的位置

161 171 163 165 167 169

 

 

5. 取下一个元素 163,并让 163 所在位置空出来,在已经排序的元素序列中从后向前扫描;

161 171   165 167 169

 

 

6. 该元素(171)大于新元素 163,将该元素移到下一位置

161   171 165 167 169

 

 

7. 继续取 171 前的元素新元素比较, 直到找到已排序的元素小于或者等于新元素的位置;新 元素大于 161,则直接插入空位中

161 163 171 165 167 169

 

 

8. 重复步骤 2~7,直到完成排序

161 163 165 167 169 171

 

 

 

插入排序: 它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描, 找到相应位置并插入。插入排序在实现上,通常采用 in-place 排序(即只需用到 O(1)的额外空间 的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供 插入空间。

具体算法描述如下:

1. 从第一个元素开始,该元素可以认为已经被排序;

2. 取出下一个元素,在已经排序的元素序列中从后向前扫描;

3. 如果该元素(已排序)大于新元素,将该元素移到下一位置; 重复步骤 3,直到找到已排序的元素小于或者等于新元素的位置;

4. 将新元素插入到该位置; 重复步骤 2~5。

 

动图演示(来源 runoob.com):

 

 

 

代码实现:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 void InsertSort(int arr[], int len)
 5 {//插入排序
 6     int preIndex = 0, current = 0;
 7     for(int i=1; i<len; i++)
 8     {
 9         preIndex = i - 1;
10         current = arr[i];
11         
12         while(preIndex >= 0 && arr[preIndex] > current)
13         {
14             arr[preIndex + 1] = arr[preIndex];
15             preIndex--;
16         }
17         
18         arr[preIndex + 1] = current;
19     }
20 }
21 
22 int main(void)
23 {
24     int beauties[]={163, 161, 158, 165, 171, 170, 163, 159,    162};
25     int len = sizeof(beauties)/sizeof(beauties[0]);
26     InsertSort(beauties, len);
27     
28     printf("数组排序以后的结果是:\n");
29     
30     for(int i=0; i<len; i++)
31     {
32         printf("%d ", beauties[i]);
33     }
34     
35     system("pause");
36     
37     return 0;
38 }

 

 

 

 

====================================================================================================================

posted @ 2020-12-12 16:34  索智源  阅读(346)  评论(0)    收藏  举报