更多"在原始序列已经有序(升序或降序)的情况下, 算法的时间复杂度为O(n2"的相关试题:
[单项选择]直接插入序列在最好情况下时间复杂度为( )
A. O(log2n)
B. O(n)
C. O(n*log2n)
D. O(n2)
[填空题]
下面程序的功能是;将两个有序链表(降序捧序)合并为一个有序链表,函数merge(node *h1,node *h2)将由h1和h2分别指向的己排序的两个链表,合并为一个依然有序的链表。注意;对于数据大小相同的结点,都要保留在合并后的链表上。主函数产生两条已降序排序的链表,并输出合并后链表上的数据值.
例如,原链表上各结点的数据依次为;
h1:15,9,8,7,3
h2:15,12,10,7,3,2
合并后得到的新链表为;15,15,12, 10,9,8,7,7,3,3,2
【程序]
#include
struct node{
int data;
node*next;
};
node *merge(node *h1,node *h2)
{
if(h1==NULL) return h2;
if(h2==NULL) return h1;
node *h=NULL;
if(___(1)___){
h=h1;
h1=h1->next;
}
else{
h=h2;
h2=h2->next;
}
node *p=h;
while(___(2)___){
if(h1->data >=h2->data){
p->next=h1;
p=h1;
h1=h1->next;
}
else{
p->next=h2;
p=
[单项选择]数据库文件结构有多种形式,记录按照查找码值的升序或降序顺序排列存储的文件结构是()。
A. 堆文件
B. N序文件
C. 散列文件
D. 索引文件
[填空题]现有字母序列(D,W,A,J,C,Z,K,S,P),若采用快速排序的方法将这个序列按字母的升序进行重排,那么以第一个字母作为分界元素,完成第一次扫描的结果为 【5】 。
[填空题]在成绩表中,将所有记录先按课程号升序排序,再按分数降序排序的命令是
SELECT*FROM 成绩表 ORDER BY 【8】 。
[单项选择]若总是以待排序列的第一个元素作为基准元素进行快速排序,那么最好情况下的时间复杂度为()。
A. O(log2n)
B. O(n)
C. O(nlog2n)
D. O(n2)
[填空题]在成绩表中,将所有记录先按课程号升序排序,再按分数降序排序的命令是
SELECT*FROM 成绩表 ORDER BY 【8】 。
[填空题]在工资表中建立查询,先按照工资升序排列,若工资相同再按照职工号降序排列,SQL语句为: SELECT * FROM 工资表 ORDER BY 工资,职工号 【13】 。
选课表(学号,课程号,成绩)
[单项选择]已知两个长度分别为m和n的升序链表,若将它们合并为一个长度为m+n的降序链表,则最坏情况下的时间复杂度是
A. O(n)
B. O(m×n)
C. O(min(m,n))
D. O(max(m,n))
[简答题]一个长度为L(L≥1)的升序序列S,处在第[L/2]个位置的数称为s的中位数。例如,若序列S1:(11,13,15,17,19),则S1的中位数是15。两个序列的中位数是含它们所有元素的升序序列的中位数。例如,若S2=(2,4,6,8,20),则S1和S2的中位数是11。现有两个等长升序序列A和B,试设计一个在时间和空间两方面都尽可能高效的算法,找出两个序列A和B的中位数。
要求:
(1)给出算法的基本设计思想。
(2)根据设计思想,采用C或C++或Java语言描述算法,关键之处给出注释。
(3)说明你所设计算法的时间复杂度和空间复杂度。
[填空题]已知序列17,18,60,40,7,32,73,65,85,采用冒泡排序法对该序列作降序排序时,第4趟的结果是 【1】 。
[填空题]冒泡排序在最好情况下时间复杂度为 【3】 。
[简答题][说明]
冒泡排序算法的基本思想是:对于无序序列(假设扫描方向为从前向后,进行升序排列),两两比较相邻数据,若反序则交换,直到没有反序为止。一般情况下,整个冒泡排序需要进行众(1≤k≤n)趟冒泡操作,冒泡排序的结束条件是在某一趟排序过程中没有进行数据交换。若数据初态为正序时,只需1趟扫描,而数据初态为反序时,需进行n-1趟扫描。在冒泡排序中,一趟扫描有可能无数据交换,也有可能有一次或多次数据交换,在传统的冒泡排序算法及近年的一些改进的算法中[2,3],只记录一趟扫描有无数据交换的信息,对数据交换发生的位置信息则不予处理。为了充分利用这一信息,可以在一趟全局扫描中,对每一反序数据对进行局部冒泡排序处理,称之为局部冒泡排序。
局部冒泡排序的基本思想是:对于N个待排序数据组成的序列,在一趟从前向后扫描待排数据序列时,两两比较相邻数据,若反序则对后一个数据作一趟前向的局部冒泡排序,即用冒泡的排序方法把反序对的后一个数据向前排到适合的位置。扫描第—对数据对,若反序,对第2个数据向前冒泡,使前两个数据成为,有序序列;扫描第二对数据对,若反序,对第3个数据向前冒泡,使得前3个数据变成有序序列;……;扫描第i对数据对时,其前i个数据已成有序序列,若第i对数据对反序,则对第i+1个数据向前冒泡,使前i+1个数据成有序序列;……;依次类推,直至处理完第n-1对数据对。当扫描完第n-1对数据对后,N个待排序数据已成了有序序列,此时排序算法结束。该算法只对待排序列作局部的冒泡处理,局部冒泡算法的
名称由此得来。
以下为C语言设计的实现局部冒泡排序策略的算法,根据说明及算法代码回答问题1和问题2。
[变量说明]
#define N=100 //排序的数据量
typedef struct //排序结点
int key;
info datatype;
......
node;
node SortData[N]; //待排序的数据组
node类型为待排序的记录(或称结点)。数组SortData[]为待排序记录的全体称为一个文件。key是作为排序依据的字段,称为排序码。datatype是与具体问题有关的
[单项选择]已知关系:学生(学号,姓名,年龄),如果按年龄降序列出所有学生,并且相同年龄的学生按姓名升序排列。则排序子句应该是( )。
A. ORDER BY年龄,姓名
B. ORDER BY姓名,年龄
C. ORDER BY年龄DESC,姓名
D. ORDER BY姓名,年龄DESC
[单项选择]为学生表建立普通索引,要求按“学号”字段升序排列,如果学号(C,4)相等,则按成绩(N,3)升序排列,下列语句正确的是( )。
A. INDEX ON 学号,成绩 TO XHCJ
B. INDEX ON 学号+成绩 TO XHCJ
C. INDEX ON 学号,STR(成绩,3)TO XHCJ
D. INDEX ON 学号+STR(成绩,3)TO XHCJ