《算法基础》——3.4 有序链表

3.4 有序链表

有时,让链表中的项保持有序是十分方便的。当将一个新项加入有序链表时,需要搜索链表来找到该项所属位置,并更新相应的链接来插入该项。
下面的伪代码显示了在一个有序链表中插入一个项的算法:

在最坏的情况下,该算法可能需要遍历整个链表为新项找到正确的位置。因此,如果该链表保存N个单元格,其运行时间为O(N)。虽然不能提高理论运行时间,但是可以通过添加底端哨兵使算法更简单而且在实际运行中更加快速。如果将底部哨兵的Value设定成一个比单元格中任意可能存储的Value值都大的值,就可以删除对top.Next!=null的测试。可以这样做是因为这个代码最终会为新的单元格找到一个合适的位置,即使该位置就在底部哨兵之前。
例如,如果单元格中的Value为使用ASCII字符表示的名字,可以设置底部哨兵的Value为“~”因为“~”字符在所有可用的字符中排名最后。如果单元格的Value为整数,就可以以最大可能的整数值来设置底部哨兵的Value。 (在大多数的32位系统中,该值为2 147 483 647。)
下面的伪代码显示了修改后的算法,并假设链表具有一个拥有最大值的底部哨兵:

时间: 2024-10-27 21:54:26

《算法基础》——3.4 有序链表的相关文章

编程算法之合并有序链表

题目: 合并有序链表, 给定两个升序的链表, 返回一个合并之后的升序链表. 节点结构: struct Node{ int val; Node *next; }; 要求实现的函数: Node* mergeList(Node *list_a, Node* list_b) 代码: /* * test.cpp * * Created on: 2014.04.24 * Author: Spike */ /*eclipse cdt, gcc 4.8.1*/ #include <iostream> #inc

《算法基础》——3.6 链表的选择排序

3.6 链表的选择排序 该选择排序算法背后的基本思想是:搜寻输入链表中所包含的最大项,然后将其添加到一个不断增长的有序链表的前面.下面的伪代码显示了选择排序算法的单向链表实现方法(默认其中的项是整数类型): 如果将寻找输入链表中最大单元格的代码抽取出来,作为一个新的算法,然后在原有算法中调用该新算法,则可以使得上面的算法变得更加简化.若输入链表包含K个项,则寻找链表中的最大项需要花费K步.在算法进行的过程中,输入链表将会缩小规模.因此,如果它最初拥有N个项,步骤的总数是N+(N-1)+(N-2)

《算法基础》——3.2 单链表

3.2 单链表 在一个单链表中,每个单元格由一个单链路连接到下一个单元格.图3-1所示的链表即是单链表. 如果要使用一个链表,就需要一系列算法来遍历链表.将项添加到链表中.查找链表中的项.删除链表中的项.以下各节将描述一些可能需要使用的算法.3.2.1 遍历链表 假设一个程序已经建立了一个链表,遍历它的单元格是比较容易的.下面的算法展示了如何遍历链表中的单元格,并使用某种方法对单元格中的值进行处理.本例中使用Print方法来显示单元格的值,但也可以用其他任何方法来代替Print方法对单元格进行操

《算法基础》——导读

**前言**算法是使高效的程序成为可能的方法.它们解释了如何排列记录.搜索项.计算数值(比如质因子分解).查找一个街道网络中的最短路径.确定可能通过通信网络的最大流.算法好坏的差别可能意味着是在一秒.一个小时内解决问题,还是永远也不能解决问题.学习算法使你能建立有用的方法工具来解决具体的问题.它能帮助你理解在不同的情况下,哪个算法是最有效的,所以对于一个特定的问题,你就能选择最适合的算法.对某些数据而言性能优异的算法可能对其他的数据而言表现糟糕.所以知道如何选择一个最适合当前情况的算法是很重要的

《算法基础》——第1章 算法基础知识 1.1 方法

第1章 算法基础知识 在开始算法学习之前,你需要一点背景知识.简单地说,首先需要知道的是算法是完成某些事情的方法.它定义了用某个方法执行一个任务的步骤.这个定义看起来足够简单,但是没有人为了做一件十分简单的工作而写算法.没有人写指令来获取数组中的第四个元素.这只是假设这是一个数组定义的一部分,并且你知道怎么去做(如果你知道如何在这个问题中使用编程语言).一般来说,人们只是为了完成复杂的任务而写算法.算法解释了如何找到一个复杂代数问题的答案,如何在一个包含数千条街道的网络中找到最短路径,抑或是如何

用javascript实现的有序链表

javascript 用javascript模仿java实现的有序链表,实现按对象的某个属性对对象进行排序. <script> function Link1(){}Link1.prototype.obj=null;Link1.prototype.next1=new Link1();function Link1.prototype.Link1(object){ obj=object;} function SortedList(){}SortedList.prototype.first=new L

Java模拟有序链表数据结构的示例_java

有序链表:按关键值排序.删除链头时,就删除最小(/最大)的值,插入时,搜索插入的位置. 插入时需要比较O(N),平均O(N/2),删除最小(/最大)的在链头的数据时效率为O(1), 如果一个应用需要频繁的存取(插入/查找/删除)最小(/最大)的数据项,那么有序链表是一个不错的选择 优先级队列 可以使用有序链表来实现 有序链表的插入排序: 对一个无序数组,用有序链表来排序,比较的时间级还是O(N^2) 复制时间级为O(2*N),因为复制的次数较少,第一次放进链表数据移动N次,再从链表复制到数组,又

一道算法基础题 uva1586

问题描述 一道算法基础题 uva1586 题目链接在这儿 http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=830&page=show_problem&problem=4461 我自己做的代码如下 但是通不过 测了好多数据都没问题 #include<cstdio> #include<cstring> using namespace std; in

链表合并-如何用递归算法实现2个有序链表的合并?

问题描述 如何用递归算法实现2个有序链表的合并? stu* Combine(stu* head1, stu* head2) { if (head1 == NULL) { return head2; } if (head2 == NULL) { return head1; } stu* head = NULL; if (head1->m_score < head2->m_score) { head = head2; head->next = Combine(head1,head2-&