基础算法--排序: 之插入排序

冒泡排序两两比较指的是: 未排序的相邻元素之间的两两比较,对于已排好的元素,它不再访问。

 

       而插入排序中的比较则是: 在未排序的元素中,取出一个,将它与已排好的元素进行比较,从而确定其位置。 

                                                         是某未排元素,与诸多已排元素的逐次比较

 

      其排序图解如下:

    

 

 

 

程序代码:

 

1) 比较一次 , 移动一次

[cpp] view plaincopy

  1.    //比较一次,移动一次  
  2.   
  3. void StraightInsertionSort(int *p,int n)  
  4. {  
  5.   
  6.     int i,j,t;  
  7.   
  8.     for (i=1;i<n;i++)   // 0...i-1 是已排好元素   i...n-1是未排元素  
  9.     {  
  10.         t=p[i]; // 记录下 将要与排好序的元素 进行比较的那个 未排序元素  
  11.         for (j=i-1;j>=0;j--)  
  12.         {  
  13.             if (t<p[j])  // 比较一次, 移动一次  
  14.             {  
  15.                 p[j+1]=p[j];  
  16.                 p[j]=t;  
  17.   
  18.             }else{  
  19.                 break;  //  已经将t 存放到目标位置  
  20.             }  
  21.         }  
  22.     }  
  23. }  


 

 

2) 先找到合适位置,再集体移动

[cpp] view plaincopy

  1. //  先找位置 再集体移动  
  2.   
  3. void StraightInsertionSort(int *p,int n)  
  4. {  
  5.   
  6.     int i,j,t;  
  7.   
  8.     for (i=1;i<n;i++)   // 0...i-1 是已排好元素   i...n-1是未排元素  
  9.     {  
  10.         t=p[i]; // 记录下 将要与排好序的元素 进行比较的那个 未排序元素  
  11.   
  12.         // 找t所应在的位置  
  13.         for (j=i-1;j>=0;j--)  
  14.         {  
  15.   
  16.             if (t>=p[j])  // 说明t应该放在j+1 位置上  
  17.                 break;  
  18.         }  
  19.   
  20.   
  21.         for (int k=i-1;k>j;k--)  
  22.         {  
  23.             p[k+1]=p[k];  
  24.         }  
  25.   
  26.         p[j+1]=t;  
  27.   
  28.     }  
  29. }  


 

3) 对于情况2,可以用二分查找法优化程序, 如下:

 

[cpp] view plaincopy

  1. void BinaryInsertionSort(int *p, int n)  
  2. {  
  3.   
  4.     int i,j,k;  
  5.   
  6.     for (i=1;i<n;i++)   // 0...i-1 是已排好元素   i...n-1是未排元素  
  7.     {  
  8.         int t=p[i]; // 记录下 将要与排好序的元素 进行比较的那个 未排序元素  
  9.   
  10.         int iLeft=0;  
  11.         int iRight=i-1;  
  12.         int iMiddle=(iLeft+iRight)/2;  
  13.   
  14.         while (iLeft<=iRight)  
  15.         {  
  16.   
  17.             if (t>p[iMiddle])  
  18.             {  
  19.                 iLeft=iMiddle+1;  
  20.             }  
  21.   
  22.             if (t<p[iMiddle])  
  23.             {  
  24.                 iRight=iMiddle-1;  
  25.             }  
  26.   
  27.   
  28.             if (t==p[iMiddle])  
  29.             {  
  30.                 j=iMiddle;  // 0....j  不需移动  j+1...i-1 需要后移一位   t 应保存在第j+1位置  
  31.                 break;  
  32.                   
  33.             }  
  34.   
  35.             iMiddle=(iLeft+iRight)/2;  
  36.   
  37.         }  
  38.   
  39.         if (iLeft>iRight)  
  40.         {  
  41.             j=iLeft-1; // 0....j  不需移动  j+1...i-1 需要后移一位   t应保存在第j+1位置  
  42.   
  43.         }  
  44.   
  45.              
  46.         for (k=i-1;k>j;k--)  
  47.         {  
  48.             p[k+1]=p[k];  
  49.         }  
  50.   
  51.         p[j+1]=t;  
  52.     }  
  53.   
  54. }  
python023基于Python旅游景点推荐系统带vue前后端分离毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值