插入排序

插入排序的主要思想是将一个待排序的一组数按照其关键码的大小插入到已经排好序的有序序列中,直到所有待排元素插入对应的序列中。下面给出维基百科上插入排序的定义:( https://zh.wikipedia.org/wiki/%E6%8F%92%E5%85%A5%E6%8E%92%E5%BA%8F )
插入排序(Insertion Sort)是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。下面用一个GIF图形象的展示该过程:
                                                                                                                                                   
下面主要介绍直接插入排序和希尔排序。
直接插入排序
直接插入排序是最简单的插入排序,往往实现该算法都是借助数组,思路就是扫描数组,把元素插入到有序的序列中。下面通过简单的给出代码:
[cpp] view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include  
  2. using namespace std;  
  3. void straightSort(int *, int);  
  4. int j; //j是全局变量  
  5. void straightSort(int *arry, int length) {  
  6.     int flag;  
  7.     for (int i = 0; i<length; i++) {  </length; i++) {  <>
  8.         flag = arry[i];  
  9.         for (j = i - 1; j >= 0 && arry[j]>flag; j--) {  
  10.             arry[j + 1] = arry[j];  
  11.         }  
  12.         arry[j + 1] = flag;//由于第二个for循环j自身减一退出循环,该处j需要自身加一  
  13.     }  
  14.   
  15. }  
  16. int main(){  
  17. int arry[] = {11,5,2,1,10,4,6,8,7};  
  18. int length = sizeof(arry) / sizeof(int);  
  19. straightSort(arry,length);  
  20. for (int i = 0; i <length; i++) {  </length; i++) {  <>
  21.     cout << arry[i] <<" ";  
  22.    }  
  23.     cout << endl;  
  24. }  
希尔排序
希尔排序(Shell Sort)是对直接插入排序的一种改进,主要思想就是把待排序的序列分割成若干个子序列,在子序列中分别进行直接插入排序,待整个序列基本有序时,再对全体元素进行一次直接插入排序。
给出该过程的代码:
[cpp] view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. #include  
  2. using namespace std;  
  3. void shellSort(int *, int);  
  4. void shellSort(int *arry, int length) {  
  5.     {  
  6.         int j, gap;  
  7.     //  for (gap = 3; gap > 0; gap--)  
  8.         for (gap = length / 2; gap > 0;gap/=2)  
  9.             for (j = gap; j < length; j++)  
  10.                 if (arry[j] < arry[j - gap])  
  11.                 {  
  12.                     int temp = arry[j];  
  13.                     int flag = j - gap;  
  14.                     while (flag >= 0 && arry[flag] > temp)  
  15.                     {  
  16.                         arry[flag + gap] = arry[flag];  
  17.                         flag -= gap;  
  18.                     }  
  19.                     arry[flag + gap] = temp;  
  20.                 }  
  21.                  }  
  22.           }  
  23.   
  24. void  main() {  
  25.     int arry[] = { 11,5,2,10,4,6,8 };  
  26.     int length = sizeof(arry) / sizeof(int);  
  27.     shellSort(arry, length);  
  28.     for (int i = 0; i < length; i++) {  
  29.         cout << arry[i] << " ";  
  30.     }  
  31.   
  32. }  
从上面可以看出希尔排序比直接插入排序相对复杂,但是如果排序思路清晰的话,该过程实现起来不是太难。如果感兴趣可以画出图解,比较直观。
文章只是简单的介绍实现算法过程,由于本人水平有限,没有详细的分析上面两种种算法的O(f(n))。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/29876893/viewspace-1978678/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/29876893/viewspace-1978678/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值