算法基础——插入排序详解

110 阅读2分钟

这是我参与更文挑战的第8天,活动详情查看: 更文挑战

插入排序思想

对于少量元素的排序,插入排序是很有效的一种排序方法。 那么它的思想是怎样的呢?

插入排序的思想是:将待排序的数组分为已排序的数列和未排序的序列。那么初始状态已排序的序列就只
有第1个元素。此后将未排序的元素逐一插入到已排序的序列中。
具体插入方法是,把未排序的元素k和它前面的已排序的元素k-1比较,如果小于已排序元素就跳过继续下
一次循环(这里默认排序方式为非降序),如果大于就和该元素交换位置,继续和k-2个元素比较,重复此
过程。

下面我们来看它的伪码

伪码

我们给插入排序的伪码取名为INSERTION-SORT(A,n)
令i2到n一次取值//因为初始状态第一个元素是已经排好序的
    令key赋值为A[i],将j赋值为i-1.
    只要j>0并且A[j]>key,执行以下操作:
        将A[j+1]赋值为A[j]
        令j自减
    A[j+1]赋值为key

大家可以参考思想来理解伪码。 这里给出c语言代码

void InsertSort(int a[],int len){
	for(int i=1;i<len;i++){
		int key = a[i];
		for(int j=i;j>0&&a[j-1]>key;j--){
			a[j]=a[j-1];
		}
		a[j]=key;
	}
}

复杂度分析

空间复杂度

从代码上可以看出插入排序仅需要常数个额外空间;

时间复杂度

函数中有两层循环,每层循环进行O(N)次比较和交换,因此整个简单插入排序的平均时间复杂度为O(N^2)。最坏的情况下,插入排序和选择排序的时间复杂度是相似的,那我们如何选择呢? 假如数组刚开始是基本有序的,那么插入排序是一个绝佳的选择。如果你不知道输入情况是否是最好的情况,那么最好选择选择排序。

以上就是我去插入排序的一些浅见,如有不足或错误之处欢迎指正。