简单排序算法时间空间复杂度分析及应用(2)-插入排序
上一篇文章提到了一些新的概念,不言而喻,概念的功能对人类来说是一项伟大的发现,百度对“概念”的定义是这样的:概念具有两个基本特征,即概念的内涵和外延;概念的内涵就是指这个概念的含义,即该概念所反映的事物对象所特有的属性。
简而言之,内循环,外循环,循环方向,循环节点这些概念能让我们的大脑清晰清楚算法的作用过程和结果。
插入排序同样也有内循环和外循环,外循环的循环节点将已确定区域和待确定区域分隔开来,该节点属于待确定区域(即待确定节点),循环方向由左向右(如图所示),外循环的起点是第二个节点,循环终点是最后一个节点。内循环是子已确定区域进行的,方向是和外循环方向相反,循环起点是外循环节点的前一个节点,终点是第一个小于外循环节点的内循环节点,如图所示。对于比较简答易懂算法例子分析微博文章推荐给大家:以人的身高站队的例子,下面我也借鉴了这位大神的微博图片,请参考:
内循环排序图:
插入排序的时间复杂度是n的平方,同冒泡排序一样,当数据一开始就已经排好序了时间复杂度就是0,当数据一开始就是倒序的,复杂度就是n*(n-1)/2,这两种情况是一个最小,一个最大的两种情况。这样的情况和冒泡排序一样
插入排序java实现(1)先查后插:
/*
* 插入排序(insert Sort)
* 时间复杂度为O(n的平方) ,最好的情况是元素交换次数为0,元素比较次数为n-1。
* @param sortOrder true表示增序,FALSE表示降序
* 第一种插入排序:先查移动元素节点,然后转移元素集合,将查和移位分开处理,即:先查后插
*/
/*
* 我这个插入排序问题很大,时间复杂度稍微比真正的插入排序要多一点,多在了内循环:两个并列的内循环
*/
public static void insertSort1(boolean sortOrder){
int k ;
for(int m = 1 ; m < array.length ; ++m)
{
int n;
for(n = m - 1 ; n >= 0 ; --n)
if((array[m] > array[n]&&sortOrder)||(array[m] < array[n]&&!sortOrder))
break;
int z ;
k = array[m];
for(z = m-1 ; z > n ; --z)
array[z+1] = array[z];
// if(array[m]!=k)
array[z+1] = k;
}
}
插入排序(2)边查边插:
* 插入排序(insert Sort)
* 时间复杂度为O(n的平方) ,最好的情况是元素交换次数为0,元素比较次数为n-1。
* @param sortOrder true表示增序,FALSE表示降序
* 第一种插入排序:这种插入排序没有查找节点的步骤,只有比较移动元素步骤
* 这一种插入拍寻:插入排序改进,内循环只有一个,即边查边插
*/
public static void insertSort2(boolean sortOrder){
int k;
for(int m = 1 ; m < array.length ; ++ m)
{
int n ;
k = array[m];
for(n = m-1 ; n >= 0; --n)
if((array[n] > k && sortOrder)||(array[n] < k && !sortOrder))
array[n+1] = array[n];
else break;
array[n+1] = k;
}
}