`
zhangyu8374
  • 浏览: 94613 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

基本算法连载(8)-Library Sort(gapped insertion sort)

阅读更多
特色: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

    在air-gapped-master这个压缩包文件中,可能包含了用于创建和维护air-gapped环境的相关资源。这可能包括: 1. **文档**:详细介绍了如何设置和管理air-gapped网络,可能包括安全策略、操作规程和故障排除指南。 2. ...

    A Sinusoidally-Modulated Leaky-Wave Antenna with Gapped Graphene Ribbons

    - 缺隙石墨烯条带(Gapped Graphene Ribbons):石墨烯是一种由碳原子以六边形排列形成的二维材料,具有独特的电子性质。在泄漏波天线中使用缺隙的石墨烯条带可以实现特定的电磁性能。 描述中涉及的知识点: - 波束...

    kubekey 3.10

    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

    blast软件的中文教程

    - **Gapped BLAST (2.0)**:新版BLAST允许在产生的比对中存在缺口,增加了灵活性。 - **PSI-BLAST (Position-Specific Iterated BLAST)**:这是一种专门用于蛋白质序列搜索的程序。它通过构建位置特异性的评分矩阵来...

    air-gapped-activation-example:使用QR码,密码证明和移动设备对气隙机器进行离线激活的示例实现

    气隙激活示例 这是使用移动设备执行激活请求的气隙(离线)设备的许可证激活的示例客户端/服务器实现。 这种激活类型不仅限于服务器端应用程序,还可以用于台式机和本地软件。 该示例应用程序尚未100%投入生产,仅...

    BLAST使用说明书

    BLAST,全称为Basic Local Alignment Search Tool(基本局部比对搜索工具),是由Altschul SF等人在1990年提出的,作为生物信息学领域中最广泛使用的序列比对工具之一,其设计初衷旨在解决生物学研究中日益增长的...

    AmazeUI折叠式卡片布局,整合内容列表、表格组件实现

    在这个示例中,`data-am-widget="accordion"`是AmazeUI的折叠式布局数据属性,`am-accordion-gapped`则用于添加间距。`&lt;dl&gt;`定义了一个卡片组,`&lt;dt&gt;`是卡片的标题,`&lt;dd&gt;`则是卡片的内容部分。`am-accordion-title`...

    kubesphere.tar1.65镜像打包

    离线安装参考文档:https://kubesphere.io/zh/docs/v3.3/installing-on-linux/introduction/air-gapped-installation/

    Blast程序安装文件

    - **搜索策略**:可以设置不同的搜索算法,如Gapped BLAST允许在比对中引入间隙,Smith-Waterman算法则用于查找全局最优比对。 **学习资源** - NCBI的官方文档提供了详尽的BLAST教程和指南,包括如何解读结果、...

    基于人口腔上皮细胞颅颌面特异增强子序列机器学习预测IRF6位点唇腭裂致病突变.pdf

    【gapped k-mer SVM算法】gapped k-mer SVM(支持向量机)是一种机器学习算法,用于从增强子序列中提取特征并建立预测模型。gapped k-mer指的是考虑了相邻碱基间间隔的k个碱基的组合,这有助于捕捉DNA序列中的结构和...

    藏经阁-The-Adventures-Of-Av-And-The-Leaky-Sandbox.pdf

    然而,针对更复杂情况,即空气隔断(air-gapped)终端的数据泄露,也有新的研究,如通过硬盘LED灯来泄露大量数据。 文章可能进一步详细分析了云AV如何被滥用,可能的攻击向量,以及如何检测和防止这种类型的泄露。...

    xmfa_tools:与XMFA文件进行交互的实用程序

    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: Parallel Gapped Read Alignment:大型基因组的领先的短读/长读比对仪之一-开源

    CUSHAW2是针对大型基因组(例如人类基因组)的快速且平行的缺口阅读比对。 通过将模拟数据集和真实数据集与人类基因组对齐进行的性能评估表明,就单端和双端对齐的对齐质量而言,CUSHAW2始终是排名最高的对齐器,...

    ChemBLAST:使用 Sequence BLAST 算法查找相似分子

    化学爆破 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 字符串并将坐标转换为参考查询

    名称Bio::Cigar - 解析 CIGAR 字符串并将坐标转换为/从参考/查询概要 use 5.014;use Bio::Cigar;...描述Bio::Cigar 是一个小型库,用于解析 CIGAR 字符串(“Compact Idiosyncratic Gapped Alignment Report

    IOTA-Secure-Airgapped-Accounting-and-Banking-System:面向政府,机构,个人和机器的带有空隙的IOTA会计系统

    这是因为生成器会在整个系统中创建相同的基本代码。 重新生成系统时,对代码的更改会在一个地方自动降落到系统的所有部分。 服务器端代码将在使用大多数操作系统的大多数计算机上运行。 生成的用户界面在浏览器中...

Global site tag (gtag.js) - Google Analytics