排序 插入排序

原创 2016年05月30日 17:02:51

插入排序

插入排序的基本思想为逐个考察每个待排序元素,将每一个新元素插入到前面已经排好序的序列中适当的位置上,使得新序列仍然是一个有序序列。插入排序可分为直接插入排序和希尔排序。

1.直接插入排序

  介绍:直接插入排序是一种最简单的排序方法,它的基本操作是将一个记录插入到已排好序的有序表中,从而得到一个新的、记录数增加1的有序表。

步骤:

1.从第一个元素开始,该元素可以认为已经被排序
2.取出下一个元素,在已经排序的元素序列中从后向前扫描
3.如果该元素(已排序)大于新元素,将该元素移到下一位置
4.重复步骤3,直到找到已排序的元素小于或者等于新元素的位置
5.将新元素插入到该位置中
6.重复步骤2

程序实现:

 void InsertSort(int* _array, int _arraySize)
 {
     assert(_array&&_arraySize > 0);//参数判断
     for (int i = 1;i < _arraySize;++i)//从数组第二个数开始插入
     {
         for (int j = i - 1;j >= 0;--j)
         {
             if (_array[j] > _array[j + 1])//从后进行插入
             {
                 swap(_array[j], _array[j+1]);
             }
             else//(_array[j] <= _array[j+1])
             //进行优化,说明前面数据均小于_array[j+1]直接跳出循环
                 break;
         }
     }
     return;
 }

效率分析:

算法稳定性:稳定

时间复杂度:O(n^2)

空间复杂度:O(1)

2.希尔排序

  介绍:希尔排序又称”缩小增量排序”,它的基本思想是 先将整个待排序分割成1若干子序列分别进行直接插入排序,待整个序列”基本有序”时,再对全体进行一次直接插入排序。希尔排序实质上是一种分组直接插入排序然后逐步合并的过程,其在时间效率上较直接插入排序有较大改进。

  步骤:

  http://www.tyut.edu.cn/kecheng1/site01/suanfayanshi/shell_sort.asp

   通过上述网址可彻底了解希尔排序的步骤。

程序实现:

 void ShellSort(int* _array,int _arraySize)
 {
     assert(_array&&_arraySize > 0);
     int gap = _arraySize;
     while (gap > 1)
     {
         gap = gap / 3 + 1;//设置希尔排序增量,保证最后一次排序时gap为1即直接插入排序

         for (int i = gap;i < _arraySize;i += gap)//从数组第gap个元素开始
         {
             for (int j = i - gap;j >= 0;j -= gap)
             {
                 if (_array[j] > _array[j + gap])
                 {
                     swap(_array[j], _array[j + gap]);
                 }
                 else if (gap == 1)//在最后直接插入排序时进行优化
                     break;
             }
         }
     }
     return;
 }

效率分析:

算法稳定性:不稳定

时间复杂度:O(n^1.3)

空间复杂度:O(1)

版权声明:本文为博主原创文章,未经博主允许不得转载。

老生常谈——选择排序和插入排序

所谓的排序就是将一组对象按照某种逻辑顺序重新排列的过程.在研究排序算法时,我们需要考虑排序的成本: 需要计算比较和交换的次数.对于不交换元素的算法需要计算访问数组的次数....
  • dd864140130
  • dd864140130
  • 2016年03月10日 13:43
  • 1319

排序算法之直接插入排序和希尔排序

相信许多人和我一样,排序算法看了好几遍,当时看懂了,过几天一些细节又忘记,所以现在讲排序算法做一个总结,从最基本的排序算法展开来,首先分析直接插入排序和希尔排序。 1.直接插入排序 思想:把一个数...
  • lierjin312158950
  • lierjin312158950
  • 2016年04月09日 15:55
  • 661

秒懂插入排序与选择排序

插入排序原理:它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 插入排序核心:假设第一个元素排好,之后的元素对排好的部分从后向前比较并逐一移动。 ...
  • booirror
  • booirror
  • 2015年04月28日 17:50
  • 15626

归并排序,选择排序,插入排序,高效插入排序,快速排序

本文总结了插入排序,归并排序,快速排序,选择排序4种方法,思路清晰。
  • cs2539263027
  • cs2539263027
  • 2016年08月30日 20:12
  • 567

数组的插入排序和快速排序

前言 关于对数组的排序,在算法中有很多方法,较为简单的有冒泡,选择,插入等一些使人熟知的算术方法,在当今这个追求效率的社会,算法的好坏对程序本身有着重要的影响。而我们在判定算法好坏的时候,时间复杂度是...
  • li741350149
  • li741350149
  • 2016年09月17日 15:27
  • 1042

【算法】插入排序/冒泡排序/选择排序

插入排序 插入排序的思想为:从数组的第二个元素开始遍历整个数组。针对每个元素,依次将其前面的所有元素和他进行比较,大于它的元素均向后移动,最后将该元素插入。 插入排序是一种稳定的排序算法。 时间...
  • cauchyweierstrass
  • cauchyweierstrass
  • 2015年11月10日 20:33
  • 1768

比较排序之插入和归并排序

排序之插入和归并插入排序: 对于少量的元素的排序,插入排序是一个很有效的算法。其原理很简单,类似于我们打扑克的时候,开始时,我们左手为空并且桌上的牌面向下,然后,我们每次从桌子上拿走一张牌并将它...
  • tao2035333
  • tao2035333
  • 2016年09月17日 21:01
  • 716

冒泡排序,选择排序,插入排序的区别

#include int swap(int *a,int *b) { int t=*a; *a=*b; *b=t; } /* 冒泡排序的原理:每次在无序队列里将相邻两个数依...
  • wdkirchhoff
  • wdkirchhoff
  • 2014年12月07日 14:02
  • 8544

快速排序和插入排序

/*快速排序是一种划分交换排序,采用分而治之的策略。 基本思想是:通过一趟排序将要排序的数据分割成两部分, 其中一部分的所有数据比另一部分的所有数据都要小, 然后再按照这个方法对这两部分数据分别进行快...
  • khwkhwkhw
  • khwkhwkhw
  • 2016年02月25日 17:48
  • 846

【数据结构与算法】内部排序之一:插入排序和希尔排序的N中实现(不断优化,附完整源码)

本来想将所有的内部排序总结为一篇博文,但是随着研究的深入,还是放弃了这个念头,斟前酌后,还是觉得分开来写比较好,具体原因,看完本篇博文也就自然明了了。 本篇文章主要探讨插入排序和希尔排序,之所...
  • mmc_maodun
  • mmc_maodun
  • 2014年02月28日 00:03
  • 5434
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:排序 插入排序
举报原因:
原因补充:

(最多只允许输入30个字)