简单排序算法时间空间复杂度分析及应用(2)-插入排序

来源:互联网 发布:怎样做好淘宝店 编辑:程序博客网 时间:2024/06/05 05:42

  简单排序算法时间空间复杂度分析及应用(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;}}





0 0