【3D技术宅公社】XR数字艺术论坛  XR技术讨论 XR互动电影 定格动画

 找回密码
 立即注册

QQ登录

只需一步,快速开始

调查问卷
论坛即将给大家带来全新的技术服务,面向三围图形学、游戏、动画的全新服务论坛升级为UTF8版本后,中文用户名和用户密码中有中文的都无法登陆,请发邮件到324007255(at)QQ.com联系手动修改密码

3D技术论坛将以计算机图形学为核心,面向教育 推出国内的三维教育引擎该项目在持续研发当中,感谢大家的关注。

查看: 2182|回复: 0

[算法/加密解密] 插入排序之三 2-路插入排序

[复制链接]
发表于 2013-8-8 13:57:41 | 显示全部楼层 |阅读模式
2-路插入排序是在折半插入排序的基础上再改进之,其目的是减少排序过程中移动记录的次数,但为此需要n个记录的辅助空间。时间复杂度为O(n^2)理解:所谓的2-路,是指优先插入在序列前面或后面,然后再考虑插入到中间。
  1. void CInsertionSort::Path2Insertion(void)
  2. {
  3.     //元素0是哨兵。
  4.     const int count = 9, length = count -1;
  5.     int L[count] = {0, 49, 38, 65, 97, 76, 13, 27, 49};
  6.     //对顺序表L作2-路插入排序。
  7.     int d[length] = { 0 };
  8.     d[0] = L[1];//L中D的第一个记录为d中排好序的记录。
  9.     int first = 0, final = 0;//first、final分别指示d中排好序的记录的第1个和最后1个记录的位置。
  10.     for (int i = 2; i <= length; ++i)//依次将L的第2个~最后一个记录插入d中。
  11.     {
  12.         if (L[i] < d[first])//待插入记录小于d中最小值,插入到d[first]之前(不需移动d数组的元素)。
  13.         {
  14.             first = (first - 1 + length) % length;
  15.             d[first] = L[i];
  16.         }
  17.         else if (L[i] > d[final])//待插入记录大于d中最小值,插入到d[final]之后(不需移动d数组的元素)。
  18.         {
  19.             final = final + 1;
  20.             d[final] = L[i];
  21.         }
  22.         else//待插入记录大于d中最小值,小于d中最大值,插入到d的中间(需要移动d数组的元素)。
  23.         {
  24.             int j = final ++;//移动d尾部元素以便按序插入记录。
  25.             while (L[i] < d[j])
  26.             {
  27.                 d[(j + 1) % length] = d[j];
  28.                 j = (j - 1 + length) % length;
  29.             }
  30.             d[j + 1] = L[i];
  31.         }
  32.     }
  33.     for (int i = 1; i <= length; i ++)//循环把d赋给L。
  34.     {
  35.         L[i] = d[(i + first - 1) % length];//线性关系。
  36.     }
  37.     //打印排序结果。
  38.     for (int i = 0; i <= length; ++ i)
  39.     {
  40.         cout << L[i] << "\t";
  41.     }
  42.     cout << endl;
  43. }
复制代码
通过巧妙的取余运算,找到正确的插入位置。要想理解算法,一定要将数值代入到程序中,用脑子来运算这段代码。只能说这个取余运算很巧妙。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|3D数字艺术论坛 ( 沪ICP备14023054号 )

GMT+8, 2024-6-8 09:02

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表