插入排序

转载 2016年05月30日 15:54:41

 在冒泡排序选择排序编写代码之后,楼主渐渐找到了coding的信心,熟能生巧,就像写词唱曲之前,都得先背诵大量的诗词,熟悉各路歌曲,才能走出自己的路线,有自己的杰作。好吧,来让楼主继续进行"社会主义初级阶段"的任务,这次是插入排序。

一. 算法描述

    插入排序插入即表示将一个新的数据插入到一个有序数组中,并继续保持有序。例如有一个长度为N的无序数组,进行N-1次的插入即能完成排序;第一次,数组第1个数认为是有序的数组,将数组第二个元素插入仅有1个有序的数组中;第二次,数组前两个元素组成有序的数组,将数组第三个元素插入由两个元素构成的有序数组中......第N-1次,数组前N-1个元素组成有序的数组,将数组的第N个元素插入由N-1个元素构成的有序数组中,则完成了整个插入排序。

以下面5个无序的数据为例:

65 27 59 64 58 (文中仅细化了第四次插入过程)

第1次插入: 27 65 59 64 58

第2次插入: 27 59 65 64 58

第3次插入: 27 59 64 65 58

第4次插入: 27 58 59 64 65

二. 算法分析

平均时间复杂度:O(n2)

空间复杂度:O(1)  (用于记录需要插入的数据)

稳定性:稳定

三. 算法实现

从前向后查找的插入排序:
[cpp] view plain copy
  1. /******************************************************** 
  2. *函数名称:InsertSort 
  3. *参数说明:pDataArray 无序数组; 
  4. *          iDataNum为无序数据个数 
  5. *说明:    插入排序 
  6. *********************************************************/  
  7. void InsertSort(int* pDataArray, int iDataNum)  
  8. {  
  9.     for (int i = 1; i < iDataNum; i++)    //从第2个数据开始插入  
  10.     {  
  11.         int j = 0;  
  12.         while (j < i && pDataArray[j] <= pDataArray[i])    //寻找插入的位置  
  13.             j++;  
  14.           
  15.         if (j < i)    //i位置之前,有比pDataArray[i]大的数,则进行挪动和插入  
  16.         {  
  17.             int k = i;  
  18.             int temp = pDataArray[i];  
  19.             while (k > j)    //挪动位置  
  20.             {  
  21.                 pDataArray[k] = pDataArray[k-1];  
  22.                 k--;  
  23.             }  
  24.             pDataArray[k] = temp;    //插入  
  25.         }  
  26.     }  
  27. }  


但楼主发现从后面查找插入的方式,代码复杂程度较低:
[cpp] view plain copy
  1. /******************************************************** 
  2. *函数名称:InsertSort 
  3. *参数说明:pDataArray 无序数组; 
  4. *          iDataNum为无序数据个数 
  5. *说明:    插入排序 
  6. *********************************************************/  
  7. void InsertSort(int* pDataArray, int iDataNum)  
  8. {  
  9.     for (int i = 1; i < iDataNum; i++)    //从第2个数据开始插入  
  10.     {  
  11.         int j = i - 1;  
  12.         int temp = pDataArray[i];    //记录要插入的数据  
  13.         while (j >= 0 && pDataArray[j] > temp)    //从后向前,找到比其小的数的位置  
  14.         {  
  15.             pDataArray[j+1] = pDataArray[j];    //向后挪动  
  16.             j--;  
  17.         }  
  18.   
  19.         if (j != i - 1)    //存在比其小的数  
  20.             pDataArray[j+1] = temp;  
  21.     }  
  22. }  


四. 算法优化

插入排序中,总是先寻找插入位置,然后在实行挪动和插入过程;寻找插入位置采用顺序查找的方式(从前向后或者从后向前),既然需要插入的数组已经是有序的,那么可以采用二分查找方法来寻找插入位置,提高算法效率,但算法的时间复杂度仍为O(n2)。

[cpp] view plain copy
  1. //查找数值iData在长度为iLen的pDataArray数组中的插入位置  
  2. int FindInsertIndex(int *pDataArray, int iLen, int iData)  
  3. {  
  4.     int iBegin = 0;  
  5.     int iEnd = iLen - 1;  
  6.     int index = -1;    //记录插入位置  
  7.     while (iBegin <= iEnd)  
  8.     {  
  9.         index = (iBegin + iEnd) / 2;  
  10.         if (pDataArray[index] > iData)  
  11.             iEnd = index - 1;  
  12.         else  
  13.             iBegin = index + 1;   
  14.     }  
  15.     if (pDataArray[index] <= iData)  
  16.         index++;  
  17.     return index;  
  18. }  
  19.   
  20. /******************************************************** 
  21. *函数名称:BinaryInsertSort 
  22. *参数说明:pDataArray 无序数组; 
  23. *          iDataNum为无序数据个数 
  24. *说明:    二分查找插入排序 
  25. *********************************************************/  
  26. void BinaryInsertSort(int* pDataArray, int iDataNum)  
  27. {  
  28.     for (int i = 1; i < iDataNum; i++)    //从第2个数据开始插入  
  29.     {  
  30.         int index = FindInsertIndex(pDataArray, i, pDataArray[i]);    //二分寻找插入的位置  
  31.           
  32.         if (i != index)    //插入位置不为i,才挪动、插入  
  33.         {  
  34.             int j = i;  
  35.             int temp = pDataArray[i];  
  36.             while (j > index)    //挪动位置  
  37.             {  
  38.                 pDataArray[j] = pDataArray[j-1];  
  39.                 j--;  
  40.             }  
  41.             pDataArray[j] = temp;    //插入  
  42.         }  
  43.     }  
  44. }  



一步步地分析排序——插入排序

一步步地分析插入排序
  • u010707039
  • u010707039
  • 2016年09月28日 15:14
  • 1223

插入排序复杂度为什么不是nlog(n)

插入排序是一种很基本的排序,其复杂度为O(n2)O(n^2),在大一学编程时没有多想,为什么不能利用二分查找改进为O(nlogn)呢O(n\log n)呢?问题描述:我们都知道插入排序就是在已有的序列...
  • q__y__L
  • q__y__L
  • 2016年12月21日 17:15
  • 747

C++模板插入排序

插入排序的C++模板实现
  • zhangxiao93
  • zhangxiao93
  • 2016年03月07日 20:19
  • 549

数组插入排序

//中心思想: 在已经排好序 的元素之间插入一个元素,用这个新插入的元素与前面已经排好序的元素进行比较,小的或大的往前移。                     class    HomeWor...
  • cql_yao10k
  • cql_yao10k
  • 2016年11月07日 23:40
  • 600

单链表实现插入排序

//单链表实现插入排序,基本思想是先生成一个空链表,然后将待排序链表的结点依次插入 //这个空链表中,所有结点都插入完毕后,这个新生成的链表就是所需的有序链表 typedef struct node ...
  • Sun19910114
  • Sun19910114
  • 2014年08月22日 23:18
  • 1879

插入排序——深入浅出(图解)

一、基本思想通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应的位置并插入。插入排序非常类似于整扑克牌。在开始摸牌时,左手是空的,牌面朝下放在桌上。接着,一次从桌上摸起一张牌,并将...
  • as02446418
  • as02446418
  • 2015年08月17日 20:46
  • 1834

【算法】插入排序的递归实现

int data[10] = {5,4,3,6,7,8,56,3,234,2}; //输入元素为: data需要排序的数组 start需要排序的数组的起始下标 end需要排序的,无序序列的首元素的下标...
  • chenglibin1988
  • chenglibin1988
  • 2013年05月19日 15:07
  • 4112

插入排序的递归实现

#include void Insert(int *a,int n)//把数组a的第n个数插入前n-1个数中,注意前n-1个数已经是排好序的了 { int i=n-1;...
  • tzasd89812
  • tzasd89812
  • 2012年06月07日 21:42
  • 1635

插入排序及C语言实现

插入排序
  • bing_bing304
  • bing_bing304
  • 2014年10月28日 19:50
  • 6736

插入排序实例

public class InsertSort { public static void main(String[] args) { // TODO Auto-generated...
  • qq_22222499
  • qq_22222499
  • 2016年06月16日 20:59
  • 198
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:插入排序
举报原因:
原因补充:

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