特色: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未满之前无需移动元素。
具体代码:
/*
* 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));
//标志gap
int 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所在位置为gap
while(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]);
}
}
分享到:
相关推荐
// Do a gapped insertion sort for this gap size. // The first gap elements a[0..gap-1] are already in gapped order // keep adding one more element until the entire array is gap sorted for (int i =...
在air-gapped-master这个压缩包文件中,可能包含了用于创建和维护air-gapped环境的相关资源。这可能包括: 1. **文档**:详细介绍了如何设置和管理air-gapped网络,可能包括安全策略、操作规程和故障排除指南。 2. ...
- 缺隙石墨烯条带(Gapped Graphene Ribbons):石墨烯是一种由碳原子以六边形排列形成的二维材料,具有独特的电子性质。在泄漏波天线中使用缺隙的石墨烯条带可以实现特定的电磁性能。 描述中涉及的知识点: - 波束...
export KKZONE=cn curl -sfL https://get-kk.kubesphere.io | sh - ...https://www.kubesphere.io/zh/docs/v3.4/installing-on-linux/introduction/air-gapped-installation/#%E9%83%A8%E7%BD%B2%E5%87%86%E5%A4%87
- **Gapped BLAST (2.0)**:新版BLAST允许在产生的比对中存在缺口,增加了灵活性。 - **PSI-BLAST (Position-Specific Iterated BLAST)**:这是一种专门用于蛋白质序列搜索的程序。它通过构建位置特异性的评分矩阵来...
气隙激活示例 这是使用移动设备执行激活请求的气隙(离线)设备的许可证激活的示例客户端/服务器实现。 这种激活类型不仅限于服务器端应用程序,还可以用于台式机和本地软件。 该示例应用程序尚未100%投入生产,仅...
BLAST,全称为Basic Local Alignment Search Tool(基本局部比对搜索工具),是由Altschul SF等人在1990年提出的,作为生物信息学领域中最广泛使用的序列比对工具之一,其设计初衷旨在解决生物学研究中日益增长的...
在这个示例中,`data-am-widget="accordion"`是AmazeUI的折叠式布局数据属性,`am-accordion-gapped`则用于添加间距。`<dl>`定义了一个卡片组,`<dt>`是卡片的标题,`<dd>`则是卡片的内容部分。`am-accordion-title`...
离线安装参考文档:https://kubesphere.io/zh/docs/v3.3/installing-on-linux/introduction/air-gapped-installation/
- **搜索策略**:可以设置不同的搜索算法,如Gapped BLAST允许在比对中引入间隙,Smith-Waterman算法则用于查找全局最优比对。 **学习资源** - NCBI的官方文档提供了详尽的BLAST教程和指南,包括如何解读结果、...
【gapped k-mer SVM算法】gapped k-mer SVM(支持向量机)是一种机器学习算法,用于从增强子序列中提取特征并建立预测模型。gapped k-mer指的是考虑了相邻碱基间间隔的k个碱基的组合,这有助于捕捉DNA序列中的结构和...
然而,针对更复杂情况,即空气隔断(air-gapped)终端的数据泄露,也有新的研究,如通过硬盘LED灯来泄露大量数据。 文章可能进一步详细分析了云AV如何被滥用,可能的攻击向量,以及如何检测和防止这种类型的泄露。...
sort XMFA file by block (LCB) and generate gapped fasta files with fasta/xmfa coordinates This is accomplished by defining a multi-pass sort using sequence IDs found in the XMFA header. The primary ...
最近,由于它们能够提高肽段识别的灵敏度,间隔序列标签(gapped tags)被引入到质谱数据分析中。但是,间隔序列标签识别中的一个核心步骤——阻塞模式匹配(Blocked Pattern Matching,简称BPM)问题却尚未得到完全...
CUSHAW2是针对大型基因组(例如人类基因组)的快速且平行的缺口阅读比对。 通过将模拟数据集和真实数据集与人类基因组对齐进行的性能评估表明,就单端和双端对齐的对齐质量而言,CUSHAW2始终是排名最高的对齐器,...
化学爆破 BLASTing 化学库相似性搜索 用法 a) 格式化输入数据库 sh format.sh data/database.txt b) 相似度搜索 sh search.sh data... Gapped blast and psiblast: a new generation of protein database search progr
名称Bio::Cigar - 解析 CIGAR 字符串并将坐标转换为/从参考/查询概要 use 5.014;use Bio::Cigar;...描述Bio::Cigar 是一个小型库,用于解析 CIGAR 字符串(“Compact Idiosyncratic Gapped Alignment Report
这是因为生成器会在整个系统中创建相同的基本代码。 重新生成系统时,对代码的更改会在一个地方自动降落到系统的所有部分。 服务器端代码将在使用大多数操作系统的大多数计算机上运行。 生成的用户界面在浏览器中...