一,引言
插入排序作为C语言学习中常见的七种排序之一,有这很强的教学意义,有助于提高同学们的代码能力,思维水平,下面我将详细介绍和讲解插入排序。
二,详细介绍
在一个数组中有一串乱序的数,插入排序就是首先将第一个位置看作有序,后面的第二个位置的数字和第一个进行比较,如果小于将第一个移动第二个的数的位置,如果大于则将该数字顶到这个位置。下面我将基于一组例子讲解:
如图这个数组中又八个数字,第一次排序将第一个位置(4)看作有序,将第二个位置(6)看作无序和前面进行排序 此时4小于6,则位置不懂,第一次排序结束。此时第一个位置和第二个位置(4)(6)为有序。
第二趟排序(4)(6)有序将第三个位置(2)看作无序,(2)和之前的数据进行比较,第一次比较(2)小于(6)则将第三个位置暂时用一个变量进行储存以防止数据丢失,将(6)向后平移到第三个位置(2)进行拷贝,此时第二个位置前面还有数据,继续和第一个位置(4)进行比较--(2)小于(4)则进行将(4)进行向后平移到原数组(6)的位置。最后(4)前面没有数据则将(2)拷贝在第一个位置(4)。完成第二趟排序。如图:
第三趟排序前三个数据有序,第四个无序和前三个进行比较遇到小的值停下或者走到开头停下
这个例子(6) 小于(7)所以直接停下。
第四趟排序前四个作为有序第五个数据和前四个比较,最后停在(2)的后面如图:
后面的数据一次类推直到最后一个数据结束这里不一一介绍。
三,代码实现
/直接插入排序
void InsertionSort(int* p, int bit)
{for (int i = 1; i < bit; i++){int j = i;int trm = p[j];while (j > 0){if (p[j - 1] < trm){break;}p[j] = p[j - 1];j--;}p[j] = trm;}
}
while循环负责控制单次循环,for循环负责连接整个数组。
四,空间复杂度
由于这个排序并没有开辟额外的空间所以空间复杂度为O(1)。
五,时间复杂度
计算最坏情况,一共N个数据,第二个数据排列1次,第三个排列2次,第四个排列3次......第N个数据排列(N-1)次。综上时间复杂度为O(N^2)。
六,稳定性
判断该排序稳不稳定的依据是:相同数据经过排序相对位置有没有发生改变,若没有改变则证明该排序稳定,反之不稳定。此排序进行的是依次排序没有改变相对位置,所以直接插入排序是稳定排序。