特色 :Library sort优于传统的插入排序(时间复杂度为O(n^2)),它的时间复杂度为O(nlogn),采用了空间换时间的策略。
思想 :一个图书管理员需要按照字母顺序放置书本,当在书本之间留有一定空隙时,一本新书上架将无需移动随后的书本,可以直接插空隙。Library sort的思想就源于此。

实现:有n个元素待排序,这些元素被插入到拥有(1+e)n个元素的数组中。每次插入2^(i-1)个元素,总共需要插logn趟。这2^(i-1)个元 素将被折半插入到已有的2^(i-1)个元素中。因此,插入i趟之后,已有2^i个元素插入数组中。此时,执行rebalance操作,原有处在(1+ e)2^i个位置的元素将被扩展到(2+2e)2^i个位置。这样,在做插入时,由于存在gap,因此在gap未满之前无需移动元素。

最好时间复杂度  O(nlogn)
平均时间复杂度  O(nlogn)
最坏时间复杂度  O(n^2)
空间复杂度    O(n)
是否稳定     是

  Library Sort基于折半查找的插入排序,插入时在元素附近空出一定位置,这样推入后移动元素的复杂度由原来的O(n)下降为平均O(1),于是整个算法的复杂度达到O(nlogn)。当输入正序或倒序时,插入点都在同一位置,“留空位”的策略失效,这时就出现最坏复杂度O(n^2)。

/*
* length:待排序元素个数
* elements:待排序数组
* factor:常数因子
*/
void librarySort(int length,float factor,int elements[]){int i,j;//扩展后的数组长度int expandedLen = (int)((1+factor)*length);int* orderedElem = (int*) malloc(expandedLen*sizeof(int));//标志gapint flag = 1<<31;for(i=0;i<expandedLen;i++){orderedElem[i] = flag;}int index = 1;int numOfIntercalatedElem = 1;orderedElem[0] = elements[0];while(length>numOfIntercalatedElem){//第i次插入2^(i-1)个元素for(j=0;j<numOfIntercalatedElem;j++){//待插入元素为elements[index]   //------------折半插入---------------int mid;int low = 0;int high = 2 * numOfIntercalatedElem - 1;while(low <= high){mid = (low + high)/2;int savedMid = mid;//如果mid所在位置为gapwhile(orderedElem[mid] == flag){     if(mid == high){//当向右遍历没有找到元素值时,改成向左遍历mid = savedMid - 1;while(orderedElem[mid] == flag){mid--;}break;}mid++;}if(elements[index] > orderedElem[mid]){low = mid + 1;//缩小范围while(orderedElem[low] == flag){low = low+1;}}else{high = mid - 1;}}   //把elements[index]插入到orderedElem[high+1]//当位置为空,没有存储元素值时...if(orderedElem[high+1] == flag){orderedElem[high+1] = elements[index];}else{//位置非空,首先往前挪动元素,如果前面已满,向后挪动元素int temp = high+1;while(orderedElem[temp] != flag){temp--;if(temp < 0){temp = high+1;break;}}     //向后移动 while(orderedElem[temp] !=flag){temp++;}     while(temp < high){orderedElem[temp] = orderedElem[temp+1];temp++;}while(temp > high+1){orderedElem[temp] = orderedElem[temp-1];temp--;}   orderedElem[temp] = elements[index];          }//--------------------------------- index++;if(index == length){break;} }numOfIntercalatedElem *=2;int generatedIndex;//Rebalance...for(j=numOfIntercalatedElem;j>0;j--){if(orderedElem[j] == flag){continue;}//原数组元素从i处移到2i处generatedIndex = j*2;if(generatedIndex >= expandedLen){    generatedIndex = expandedLen - 1;if(orderedElem[generatedIndex] != flag){break;}}   orderedElem[generatedIndex] = orderedElem[j];orderedElem[j] = flag;}     }//测试输出for(i=0;i<expandedLen;i++){printf("%d\n",orderedElem[i]);}}

library sort(图书馆排序)相关推荐

  1. library sort (图书馆排序)

    特色 :Library sort优于传统的插入排序(时间复杂度为O(n^2)),它的时间复杂度为O(nlogn),采用了空间换时间的策略. 思想 :一个图书管理员需要按照字母顺序放置书本,当在书本之间 ...

  2. C++library Sort库排序的实现算法(附完整源码)

    C++library Sort库排序的实现算法 C++library Sort库排序的实现算法完整源码(定义,实现,main函数测试) C++library Sort库排序的实现算法完整源码(定义,实 ...

  3. redis 的使用 (sort set排序集合类型操作)

    sort set排序集合类型 释义: sort set 是 string 类型的集合 sort set 的每个元素 都会关联一个 权 通过 权值 可以有序的获取集合中的元素 应用场合: 获取热门帖子( ...

  4. Shell Sort 希尔排序 收藏

    Shell Sort 希尔排序 收藏 希尔排序(Shell Sort)又叫做缩小增量排序(diminishing increment sort),是一种很优秀的排序法,算法本身不难理解,也很容易实现, ...

  5. [Java基础] sort方法--------排序的那些事

    引言 在学习Java过程中,排序sort是我们常用的功能:在Java里,数组有Arrays.sort()可以排序,集合则是Collections.sort()方法排序:默认情况下是升序排列,但是降序又 ...

  6. Hark的数据结构与算法练习之图书馆排序

    算法说明 图书馆排序是插入排序的变种,典型的以空间换时间的一种方法.我个人感觉这种思路可以学习借鉴,但直接使用的场景应该不大. 我们知道,真正的插入排序通常往前边插入元素后,我们要把后边所有的元素后移 ...

  7. 关于SAP的“Sort key 排序码”

    对一个SAP新手来说,科目主档.客户主档.供应商主档中都有一个排序码栏位是比较不好理解的,下面我用图片来简单说明一下Sort key 排序码 的用途. 排序码的作用是凭证在生成时自动指定"分 ...

  8. 倒序排序_排序算法(六):Counting Sort 计数排序

    之前文章介绍的一些排序算法都是基于比较来进行排序的,故它们在平均情况下的时间复杂度最好也不过是线性对数级别.这里我们来介绍一种简单的基于非比较的排序算法--Counting Sort 计数排序,其时间 ...

  9. C语言最简单的sleep sort睡眠排序实现(附完整源码)

    C语言最简单的sleep sort睡眠排序实现 C语言最简单的sleep sort睡眠排序实现完整源码(定义,实现,main函数测试) C语言最简单的sleep sort睡眠排序实现完整源码(定义,实 ...

最新文章

  1. 崛起于Springboot2.X之Mybatis-全注解方式操作Mysql(4)
  2. C#实现所有经典排序算法汇总
  3. java高分面试指南:java单例模式双重检查
  4. WebAPi返回类型到底应该是什么才合适,这是个问题?
  5. Unity3D——SendMessage方法的使用
  6. webStorm关闭自动保存
  7. python+request+Excel做接口自动化测试
  8. 计算机视觉实战(二)图像基本操作
  9. 学习JAVA环境搭建之下载安装MyEclipse 6.5
  10. 《密码编码学与网络安全》William Stalling著---学习笔记(一)【知识点速过】【传统密码+经典对称加密算法+经典公钥密码算法+密码学Hash函数】
  11. [亲自试过有效] 错误1606。无法访问网络位置
  12. 表贴电阻尺寸与什么有关_贴片电阻简介:功率大小与尺寸对应表
  13. 首发:Meltdown漏洞分析与实践
  14. 银河麒麟桌面V10SP1安装nosqlbooster 可视化工具
  15. V831基础-切换屏幕
  16. 高中会考计算机都考啥,高中会考都有哪些科目
  17. Qt多线程使用 和 信号与槽传参 需要注意的问题
  18. 华为hcia-datacom 学习日记
  19. VulnHub渗透测试实战靶场笔记(持续更新)
  20. Vdbench:解决多台服务器联机运行时,出现的常见问题记录2

热门文章

  1. 【荣耀】2021年招聘开启,新荣耀,新征程 (base Xian or Beijing) - 内推
  2. 生产管理系统定制开发的项目流程
  3. 傅里叶变换求解 KdV 方程
  4. 苹果商城怎么调成中文_深入探讨:承德洋葱电商平台怎么开店
  5. 微信小程序官方bug
  6. 平板触控笔要原装的吗?时下最火的平替苹果笔测评
  7. Masking Adversarial Damage: Finding Adversarial Saliency for Robust and Sparse Network
  8. 联想服务器SR650升级网卡固件微码
  9. [转][TFS] 禁止默认允许多人签出和强制解除签入签出锁
  10. 8种绝对成交的销售话术技巧