当前位置:文档之家› 十外部排序

十外部排序

数据结构第10章 习题答案

1.下列排序算法中,其中( D )是稳定的。 A. 堆排序,冒泡排序 B. 快速排序,堆排序 C. 直接选择排序,归并排序 D. 归并排序,冒泡排序 2.有一组数据(15,9,7,8,20,-1,7,4)用快速排序的划分方法进行一趟划分后数据的排序为 ( A )(按递增序)。 A.下面的B,C,D都不对。 B.9,7,8,4,-1,7,15,20 C.20,15,8,9,7,-1,4,7 D. 9,4,7,8,7,-1,15,20 3.下列排序算法中,在每一趟都能选出一个元素放到其最终位置上,并且其时间性能受数据初始特性影响的是:( B )。 A. 直接插入排序 B. 快速排序 C. 直接选择排序 D. 堆排序 4.如果只想得到1000个元素组成的序列中第5个最小元素之前的部分排序的序列,用( D )方法最快。 A.起泡排序 B.快速排列 C.Shell排序 D.堆排序 E.简单选择排序 5.从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在已排序序列的合适位置,该排序方法称为( A )排序法。 A. 插入 B. 选择 C. 希尔 D. 二路归并 6. 在排序算法中,每次从未排序的记录中挑出最小(或最大)关键码字的记录,加入到已排序记录的末尾,该排序方法是( A )。 A. 选择 B. 冒泡 C. 插入 D. 堆 7. 若用冒泡排序方法对序列{10,14,26,29,41,52}从大到小排序,需进行( C )次比较。 A. 3 B. 10 C. 15 D. 25 8. 对序列{15,9,7,8,20,-1,4,} 用希尔排序方法排序,经一趟后序列变为{15,-l,4,8,20,9,7}则该次采用的增量是 ( B ) A. l B. 4 C. 3 D. 2 9. 堆排序是( E )类排序 A. 插入 B. 交换 C. 归并 D. 基数 E. 选择 10.排序方法有许多种,(1)法从未排序的序列中依次取出元素,与已排序序列(初始时为空)中的元素作比较,将其放入已排序序列的正确位置上;(2)法从未排序的序列中挑选元素,并将其依次放入已排序序列(初始时为空)的一端;交换排序方法是对序列中的元素进行一系列比较,当被比较的两元素逆序时,进行交换;(3)和(4)是基于这类方法的两种排序方法,而(4)是比(3)效率更高的方法;(5)法是基于选择排序的一种排序方法,是完全二叉树结构的一个重要应用。 (1)--(5): A.选择排序 B.快速排序 C.插入排序 D.起泡排序 E.归并排序 F.shell排序 G.堆排序 H.基数排序 10.1C 5 2A 3D 4B 5G 1.若不考虑基数排序,则在排序过程中,主要进行的两种基本操作是关键字的__ ____和记录的_____。比较,移动 2.分别采用堆排序,快速排序,冒泡排序和归并排序,对初态为有序的表,则最省时间的是_____算法,最费时间的是______算法。冒泡,快速 3. 设用希尔排序对数组{98,36,-9,0,47,23,1,8,10,7}进行排序,给出的步长(也称增量序列)依次是4,2,1则排序需__________趟,写出第一趟结束后,数组中数据的排列次序__________。3,(10,7,-9,0,47,23,1,8,98,36) 4.对给定文件(28,07,39,10,65,14,61,17,50,21)选择第一个元素28进行划分,写出其快速排序第一遍的排序过程。

几种常见内部排序算法比较

常见内部排序算法比较 排序算法是数据结构学科经典的内容,其中内部排序现有的算法有很多种,究竟各有什么特点呢?本文力图设计实现常用内部排序算法并进行比较。分别为起泡排序,直接插入排序,简单选择排序,快速排序,堆排序,针对关键字的比较次数和移动次数进行测试比较。 问题分析和总体设计 ADT OrderableList { 数据对象:D={ai| ai∈IntegerSet,i=1,2,…,n,n≥0} 数据关系:R1={〈ai-1,ai〉|ai-1, ai∈D, i=1,2,…,n} 基本操作: InitList(n) 操作结果:构造一个长度为n,元素值依次为1,2,…,n的有序表。Randomizel(d,isInverseOrser) 操作结果:随机打乱 BubbleSort( ) 操作结果:进行起泡排序 InserSort( ) 操作结果:进行插入排序 SelectSort( ) 操作结果:进行选择排序 QuickSort( ) 操作结果:进行快速排序 HeapSort( ) 操作结果:进行堆排序 ListTraverse(visit( )) 操作结果:依次对L种的每个元素调用函数visit( ) }ADT OrderableList 待排序表的元素的关键字为整数.用正序,逆序和不同乱序程度的不同数据做测试比较,对关键字的比较次数和移动次数(关键字交换计为3次移动)进行测试比较.要求显示提示信息,用户由键盘输入待排序表的表长(100-1000)和不同测试数据的组数(8-18).每次测试完毕,要求列表现是比较结果. 要求对结果进行分析.

详细设计 1、起泡排序 算法:核心思想是扫描数据清单,寻找出现乱序的两个相邻的项目。当找到这两个项目后,交换项目的位置然后继续扫描。重复上面的操作直到所有的项目都按顺序排好。 bubblesort(struct rec r[],int n) { int i,j; struct rec w; unsigned long int compare=0,move=0; for(i=1;i<=n-1;i++) for(j=n;j>=i+1;j--) { if(r[j].key

中南大学数据结构与算法第10章内部排序课后作业答案

第10章内部排序习题练习答案 1.以关键字序列(265,301,751,129,937,863,742,694,076,438)为例,分别写出执行以下排序算法的各趟排序结束时,关键字序列的状态。 (1) 直接插入排序(2)希尔排序(3)冒泡排序(4)快速排序 (5) 直接选择排序(6) 堆排序(7) 归并排序(8)基数排序 上述方法中,哪些是稳定的排序?哪些是非稳定的排序?对不稳定的排序试举出一个不稳定的实例。 答: (1)直接插入排序:(方括号表示无序区) 初始态: 265[301 751 129 937 863 742 694 076 438] 第一趟:265 301[751 129 937 863 742 694 076 438] 第二趟:265 301 751[129 937 863 742 694 076 438] 第三趟:129 265 301 751[937 863 742 694 076 438] 第四趟:129 265 301 751 937[863 742 694 076 438] 第五趟:129 265 301 751 863 937[742 694 076 438] 第六趟:129 265 301 742 751 863 937[694 076 438] 第七趟:129 265 301 694 742 751 863 937[076 438] 第八趟:076 129 265 301 694 742 751 863 937[438] 第九趟:076 129 265 301 438 694 742 751 863 937

(2)希尔排序(增量为5,3,1) 初始态: 265 301 751 129 937 863 742 694 076 438 第一趟:265 301 694 076 438 863 742 751 129 937 第二趟:076 301 129 265 438 694 742 751 863 937 第三趟:076 129 265 301 438 694 742 751 863 937 (3)冒泡排序(方括号为无序区) 初始态[265 301 751 129 937 863 742 694 076 438] 第一趟:076 [265 301 751 129 937 863 742 694 438] 第二趟:076 129 [265 301 751 438 937 863 742 694] 第三趟:076 129 265 [301 438 694 751 937 863 742] 第四趟:076 129 265 301 [438 694 742 751 937 863] 第五趟:076 129 265 301 438 [694 742 751 863 937] 第六趟:076 129 265 301 438 694 742 751 863 937 (4)快速排序:(方括号表示无序区,层表示对应的递归树的层数)

内部排序代码

#include #include #include #include #define OK 1 #define FALSE 0 #define MAX_NUM 100 typedef int Status; typedef int ElemType; typedef struct SqList { ElemType r[MAX_NUM]; int length; }SqList; typedef SqList HeapType; Status Exchange(ElemType &a,ElemType &b) { ElemType t; t=a;a=b;b=t; return OK; } //直接插入排序 Status InsertSort(SqList &L) { int i,j; for(i=2;i<=L.length;i++) if(L.r[i]

for(j=i-dk;j>0&&L.r[0]>t; for(j=1,i=t-1;i>=0;i--,j<<=1) dlta[i]=j+1; dlta[t-1]--; for(i=0;iL.r[j+1]) Exchange(L.r[j],L.r[j+1]); return OK; } //快速排序 int Partition(SqList &L,int low,int high) { int pivotkey=L.r[low]; L.r[0]=L.r[low]; while(low=pivotkey) high--; L.r[low]=L.r[high]; while(low

内部排序算法的实现与比较

内部排序算法的实现与 比较 Company Document number:WUUT-WUUY-WBBGB-BWYTT-1982GT

实验四:内部排序算法的实现与比较 一、问题描述 1.实验题目:在教科书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大致执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。 2.基本要求:(1)对常用的内部排序算法进行比较:直接插入排序、简单选择排序、冒泡排序、快速排序、希尔排序、归并排序。 (2利用随机函数产生N(N=30000)个随机整数,作为输入数据作比较;比较的指标为关键字参加的比较次数和关键字的移动次数(关键字交换记为3次移动)。 (3)对结果作出简要分析。 3.测试数据:随机函数产生。 二、需求分析 1.程序所能达到的基本可能:通过随机数据产生N个随机数,作为输入数据作比较;对常用的内部排序算法:直接插入排序、简单选择排序、冒泡排序、快速排序、希尔排序、归并排序进行比较:比较的指标为关键字参加的比较次数和关键字的移动次数(关键字交换记为3次移动)。最后结果输出各种排序算法的关键字参加的比较次数和关键字的移动次数,并按从小到大排列。 2.输入的形式及输入值范围:随机函数产生的N(N=30000)个随机整数。 3.输出的形式:输出各种排序算法的关键字参加的比较次数和关键字的移动次数。并按从小到大排列。 4.测试数据要求:随机函数产生的N(N=30000)个随机整数。 三、概要设计 1. 所用到得数据结构及其ADT 为了实现上述功能,应以一维数组表示集合数据类型。 int s[N]; int compare[6]={0},move[6]={0},D[N]={0},RS[N]={0}; 基本操作: 数组赋值: for(i=1;i

数据结构严蔚敏版第十章答案

第十章内部排序 10.23 void Insert_Sort1(SqList &L)//监视哨设在高下标端的插入排序算法 { k=L.length; for(i=k-1;i;--i) //从后向前逐个插入排序 if(L.r[i].key>L.r[i+1].key) { L.r[k+1].key=L.r[i].key; //监视哨 for(j=i+1;L.r[j].key>L.r[i].key;++j) L.r[j-1].key=L.r[j].key; //前移 L.r[j-1].key=L.r[k+1].key; //插入 } }//Insert_Sort1 10.24 void BiInsert_Sort(SqList &L)//二路插入排序的算法 { int d[MAXSIZE]; //辅助存储 x=L.r.key;d=x; first=1;final=1; for(i=2;i<=L.length;i++) { if(L.r[i].key>=x) //插入前部 { for(j=final;d[j]>L.r[i].key;j--) d[j+1]=d[j]; d[j+1]=L.r[i].key; final++; } else //插入后部 { for(j=first;d[j]

第十章排序-例题

例题1:已知序列{17,18,60,40,7,32,73,65,85},请给出采用冒泡排序法对该序列作升序排序时的每一趟的结果。 解:依题意,采用冒泡排序法排序的各趟的结果如下: 初始:17,18,60,40,7,32,73,65,85 第1趟:17,18,40,7,32,60,65,73,85 第2趟:17,18,7,32,40,60,65,73,85 第3趟:17,7,18,32,40,60,65,73,85 第4趟:7,17,18,32,40,60,65,73,85 第5趟:7,17,18,32,40,60,65,73,85 第5趟无元素交换,则排序结束。 例题2:已知序列{503,87,512,61,908,170,897,275,652,462},采用快速排序法对该序列作升序排序时的每一趟的结果。 解:依题意,采用快速排序法排序的各趟的结果如下 初始:503,87,512,61,908,170,897,275,652,462 第1趟:[462,87,275,61,170 ] 503[897,908,652,512 ] 第2趟:[170,87,275,61 ] 462,503 [897,908,652,512 ] 第3趟:[61,87 ]170 [275] 462,503 [897,908,652,512 ] 第4趟:61 [87 ]170 [275] 462,503 [897,908,652,512 ] 第5趟:61,87,170 [275] 462,503 [897,908,652,512 ] 第6趟:61,87,170,275,462,503 [897,908,652,512 ] 第7趟:61,87,170,275,462,503 [512,652] 897 [908 ] 第8趟:61,87,170,275,462,503,512 [652] 897 [908 ] 第9趟:61,87,170,275,462,503,512,652,897 [908 ]

内部排序算法的实现与比较

实验四:内部排序算法的实现与比较 一、问题描述 1.实验题目:在教科书中,各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大致执行时间。试通过随机数据比较各算法的关键字比较次数和关键字移动次数,以取得直观感受。2.基本要求:(1)对常用的内部排序算法进行比较:直接插入排序、简单选择排序、冒泡排序、快速排序、希尔排序、归并排序。 (2利用随机函数产生N(N=30000)个随机整数,作为输入数据作比较;比较的指标为关键字参加的比较次数和关键字的移动次数(关键字交换记为3次移动)。 (3)对结果作出简要分析。 3.测试数据:随机函数产生。 二、需求分析 1.程序所能达到的基本可能:通过随机数据产生N个随机数,作为输入数据作比较;对常用的内部排序算法:直接插入排序、简单选择排序、冒泡排序、快速排序、希尔排序、归并排序进行比较:比较的指标为关键字参加的比较次数和关键字的移动次数(关键字交换记为3次移动)。最后结果输出各种排序算法的关键字参加的比较次数和关键字的移动次数,并按从小到大排列。 2.输入的形式及输入值范围:随机函数产生的N(N=30000)个随机整数。 3.输出的形式:输出各种排序算法的关键字参加的比较次数和关键字的移动次数。并按从小到大排列。 4.测试数据要求:随机函数产生的N(N=30000)个随机整数。 三、概要设计 1. 所用到得数据结构及其ADT 为了实现上述功能,应以一维数组表示集合数据类型。 int s[N]; int compare[6]={0},move[6]={0},D[N]={0},RS[N]={0}; 基本操作: 数组赋值: for(i=1;i

全国自考数据结构导论(串、外部排序)模拟试卷1.doc

全国自考数据结构导论(串、外部排序)模拟试卷1 一、单项选择题 1 以下有关串的描述中,_________是不正确的。 (A)串是字符的有限序列 (B)子串是串中任意连续字符组成的子序列 (C)串可以采用顺序存储或链式存储 (D)空串是由一个或多个空格组成的串 2 串的长度是指_________。 (A)串中包含的字符个数 (B)串中包含的不同字符个数 (C)串中除空格以外的字符个数 (D)串中包含的不同字母个数 3 若串中字符经常发生变化,则采用_______存储方式最合适。 (A)定长顺序 (B)堆 (C)链式

(D)散列 4 串是一种特殊的线性表,其特殊性体现在_______。 (A)可顺序存储 (B)数据元素是一个字符 (C)可链接存储 (D)数据元素可以是多个字符。 5 设有两个串S和T,求T在s中首次出现的位置的运算是________运算。 (A)求子串 (B)串插入 (C)串连接 (D)模式匹配 6 已知两个串s==“abcczym”和T=“abccyzm”,则StrEqual串判等操作的结果是________。 (A)一1 (B)0 (C)1

(D)64 7 设s1=“Hello”,s2=“student”,函数StrDel(s2,strlen,(S1),3)的值是________ (A)空串 (B)lo (C)stud (D)ent 8 若字符串”abcdefg”采用链式存储,假设每个字符占用1个字节,每个指针占用2个字节,则改字符串的存储密度为__________。 (A)20% (B)30% (C)33.3% (D)40% 9 空串与空格串是相同的,这种说法_________。 (A)正确 (B)不正确 (C)可以说正确的

第十章 排序

第十章排序 一、名词解释 1.排序 2.内部排序 3.外部排序 4.堆 5.堆排序 二、填空 1.若待排序的序列中存在多个记录具有相同的键值,经过排序,这些记录的相对次序仍然保持不变,则称这种排序方法是________的,否则称为 ________的。 2.按照排序过程涉及的存储设备的不同,排序可分为________排序和 ________排序。 3.按排序过程中依据的不同原则对内部排序方法进行分类,主要有: ________、________、________、 ________等四类。 4.在排序算法中,分析算法的时间复杂性时,通常以________和________为标准操作。评价排序的另一个主要标准是执行算法所需要的________。 5.常用的插入排序方法有________插入排序、________插入排序、________插入排序和________插入排序。 6.以下为直接插入排序的算法。请分析算法,并在________上填充适当的语句。 void straightsort(list r); {for(i=___________;i<=n;i++) {r[0]=r[i];j=i-1; while(r[0].key

数据结构中的内部排序算法及性能分析

数据结构中的排序算法及性能分析 一、引言 排序(sorting )是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个按关键字有序的序列。为了查找方便通常希望计算机中的表是按关键字有序的。因为有序的顺序表可以使用查找效率较高的折半查找法。 在此首先明确排序算法的定义: 假设n 个记录的序列为 { 1R ,2R ,…n R } (1) 关键字的序列为: { 1k ,2k ,…,n k } 需要确定1,2,…,n 的一种排列:12,n p p p ,…,使(1)式的序列成为一个按关键字有序的序列: 12p p pn k k k ≤≤≤… 上述定义中的关键字Ki 可以是记录Ri (i=1,2,…,n )的主关键字,也可以是记录i R 的次关键字,甚至是若干数据项的组合。若在序列中有关键字相等的情况下,即存在i k =j k (1,1,i n j n i j ≤≤≤≤≠),且在排序前的序列中i R 领先于j R 。若在排序后的序列中Ri 仍领先于j R ,则称所用的排 序方法是稳定的;反之若可能使排序后的序列中j R 领先于i R ,则称所用的排序方法是不稳定的。 一个算法执行所耗费的时间,从理论上是不能算出来的,必须上机运行测试才能知道。但我们不可能也没有必要对每个算法都上机测试,只需知道哪个算法花费的时间多,哪个算法花费的时间少就可以了。并且一个算法的时间与算法中语句执行次数成正比,那个算法中语句执行次数多,它花费时间就多。一个算法中的语句执行次数称为语句频度或时间频度,记为T(n)。 在刚才提到的时间频度中,n 称为问题的规模,当n 不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n 的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n 趋近于无穷大时,T (n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。

《第9章内部排序》习题解答

第9章内部排序 本章学习要点 ◆熟悉并掌握本章中各种内部排序方法的基本思想及其实现过程 ◆掌握各种内部排序算法的时间复杂度和空间复杂度的计算和分析方法 ◆了解各种内部排序方法的优缺点以及其不同的应用场合 ◆要求能够针对实际问题的特点选择合理的排序算法并通过编程实现 排序(Sorting)是计算机程序设计中的一种重要运算,它的功能是将一组数据元素按照其关键字的某种规定顺序(递增或递减)进行排列。对数据元素进行排序的目的是为了便于查找,在关键字有序的一组数据中的查找要比无序时更容易,速度也更快。 本章主要介绍几种常用的内部排序方法,主要有:插入排序、交换排序、选择排序、归并排序和基数排序。最后对各种排序算法的时间复杂度和空间复杂度进行了分析和比较,并且讨论了如何针对实际问题合理选择排序算法等内容。 9.1排序的有关概念和数组的输入与输出 9.1.1排序的概念 1.排序 将一个数据元素的任意序列,重新排列成一个按关键字有序(递增有序或递减有序)的序列的过程叫排序。 2.排序方法的稳定性 若在排序过程中,序列的两个关键字值相同的记录的相对位置不发生改变,则称所用的排序方法为稳定的;反之,若在某个序列的排序过程中关键字值相同的记录的相对位置发生了改变,则称所用的排序方法是不稳定的。 3.内部排序和外部排序

在排序过程中,如果待排序列全部读入计算机存储器中,则称此为内部排序;反之,若待排序列仅有部分记录在内存中,在排序过程中还要对外存中的纪录进行访问,这样的排序过程叫外部排序。 4.排序方法的性能分析 对于所选用的排序方法的好坏主要是基于其算法的时间复杂度和空间复杂度两方面进行分析。 5.数据元素类型说明 数据元素可以是任意一个结构类型,排序过程是按元素中的某个关键字(数据项)进行排序。不失一般性,我们在本章的所有例题中总是假定待排序列中的数据元素中只含有关键字项,且其数据类型为整型。 9.1.2一维数组的输入与输出 1.数组输入操作 函数void Input(int *A,int n)的功能是,从键盘输入n个整数到数组A[]中。 #include"iostream.h" void Input(int *A,int n) { int i; cout<<"请输入"<>A[i]; } 2.数组输出操作 函数void Output(int A[],int n)的功能是,依次显示输出数组A[]中的n个整数。 void Output(int A[],int n) { int i; cout<<"结果为:\n"; for(i=0;i

第十章排序答案

第10章排序 一、选择题 1.某内排序方法的稳定性是指( D )。【南京理工大学 1997 一、10(2分)】 A.该排序算法不允许有相同的关键字记录 B.该排序算法允许有相同的关键字记录 C.平均时间为0(n log n)的排序方法 D.以上都不对 2.下面给出的四种排序法中( D )排序法是不稳定性排序法。【北京航空航天大学 1999 一、10 (2分)】 A. 插入 B. 冒泡 C. 二路归并 D. 堆积 3.下列排序算法中,其中(D )是稳定的。【福州大学 1998 一、3 (2分)】 A. 堆排序,冒泡排序 B. 快速排序,堆排序 C. 直接选择排序,归并排序 D. 归并排序,冒泡排序 4.稳定的排序方法是( B )【北方交通大学 2000 二、3(2分)】 A.直接插入排序和快速排序 B.折半插入排序和起泡排序 C.简单选择排序和四路归并排序 D.树形选择排序和shell排序 5.下列排序方法中,哪一个是稳定的排序方法?( B )【北方交通大学 2001 一、8(2分)】A.直接选择排序 B.二分法插入排序 C.希尔排序 D.快速排序 6. 快速排序方法在( D )情况下最不利于发挥其长处。【燕山大学 2001 一、3 (2分)】 A. 要排序的数据量太大 B. 要排序的数据中含有多个相同值 C. 要排序的数据个数为奇数 D. 要排序的数据已基本有序 7. 以下序列不是堆的是( D )。【西安电子科技大学 2001应用一、5 (2分)】 A. (100,85,98,77,80,60,82,40,20,10,66) B. (100,98,85,82,80,77,66,60,40,20,10) C. (10,20,40,60,66,77,80,82,85,98,100) D. (100,85,40,77,80,60,66,98,82,10,20) 8.下列四个序列中,哪一个是堆( C )。【北京工商大学 2001 一、8 (3分)】 A. 75,65,30,15,25,45,20,10 B. 75,65,45,10,30,25,20,15 C. 75,45,65,30,15,25,20,10 D. 75,45,65,10,25,30,20,15 9.从未排序序列中依次取出一个元素与已排序序列中的元素依次进行比较,然后将其放在已排序序列的合适位置,该排序方法称为( A )排序法。【北京航空航天大学 1999 一、8(2分)】 A. 插入 B. 选择 C. 希尔 D. 二路归并 10.比较次数与排序的初始状态无关的排序方法是( D )。【北方交通大学 2000 二、2(2分)】A.直接插入排序 B.起泡排序 C.快速排序 D.简单选择排序 11.对关键码序列28,16,32,12,60,2,5,72快速排序,从小到大一次划分结果为( B )。 A. (2,5,12,16)26(60,32,72) B. (5,16,2,12)28(60,32,72) C. (2,16,12,5)28(60,32,72) D. (5,16,2,12)28(32,60,72) 【青岛大学 2000 三、4 (2分)】12.下列排序算法中( B )不能保证每趟排序至少能将一个元素放到其最终的位置上。 A.快速排序 B. shell排序 C. 堆排序 D.冒泡排序【合肥工业大学 2001 一、3(2分)】13.有一组数据(15,9,7,8,20,-1,7,4)用快速排序的划分方法进行一趟划分后数据的排序为 ( A )(按递增序)。【南京理工大学 1996 一、4 (2分)】 A.下面的B,C,D都不对。 B.9,7,8,4,-1,7,15,20 C.20,15,8,9,7,-1,4,7 D. 9,4,7,8,7,-1,15,20 14.一组记录的关键码为(46,79,56,38,40,84),则利用快速排序的方法,以第一个记录为基准得到的一次划分结果为( C )。【燕山大学 2001 一、4(2分)】 A.(38,40,46,56,79,84) B. (40,38,46,79,56,84) C.(40,38,46,56,79,84) D. (40,38,46,84,56,79) 15.下列排序算法中,在待排序数据已有序时,花费时间反而最多的是( C )排序。 A.冒泡 B. 希尔 C. 快速 D. 堆【南京理工大学 2001 一、12 (1.5分)】 16. 对初始状态为递增序列的表按递增顺序排序,最省时间的是( C )算法,最费时间的是( B )算 法。 A. 堆排序 B. 快速排序 C. 插入排序 D. 归并排序【南开大学 2000 一、5】 17. 就平均性能而言,目前最好的内排序方法是( D )排序法。【西安电子科技大学 1998 一、9 (2分)】 A. 冒泡 B. 希尔插入 C. 交换 D. 快速 18.如果只想得到1000个元素组成的序列中第5个最小元素之前的部分排序的序列,用( D )方法最快。

数据结构课程设计(内部排序算法比较 C语言)

课题:内部排序算法比较 第一章问题描述 排序是数据结构中重要的一个部分,也是在实际开发中易遇到的问题,所以研究各种排算法的时间消耗对于在实际应用当中很有必要通过分析实际结合算法的特性进行选择和使用哪种算法可以使实际问题得到更好更充分的解决!该系统通过对各种内部排序算法如直接插入排序,冒泡排序,简单选择排序,快速排序,希尔排序,堆排序、二路归并排序等,以关键码的比较次数和移动次数分析其特点,并进行比较,估算每种算法的时间消耗,从而比较各种算法的优劣和使用情况!排序表的数据是多种不同的情况,如随机产生数据、极端的数据如已是正序或逆序数据。比较的结果用一个直方图表示。 第二章系统分析 界面的设计如图所示: |******************************| |-------欢迎使用---------| |-----(1)随机取数-------|

|-----(2)自行输入-------| |-----(0)退出使用-------| |******************************| 请选择操作方式: 如上图所示该系统的功能有: (1):选择 1 时系统由客户输入要进行测试的元素个数由电脑随机选取数字进行各种排序结果得到准确的比较和移动次数并打印出结果。 (2)选择 2 时系统由客户自己输入要进行测试的元素进行各种排序结果得到准确的比较和移动次数并打印出结果。 (3)选择0 打印“谢谢使用!!”退出系统的使用!! 第三章系统设计 (I)友好的人机界面设计:(如图3.1所示) |******************************| |-------欢迎使用---------| |-----(1)随机取数-------| |-----(2)自行输入-------| |-----(0)退出使用-------| |******************************| (3.1) (II)方便快捷的操作:用户只需要根据不同的需要在界面上输入系统提醒的操作形式直接进行相应的操作方式即可!如图(3.2所示) |******************************| |-------欢迎使用---------| |-----(1)随机取数-------| |-----(2)自行输入-------| |-----(0)退出使用-------|

10内部排序

第10章内部排序 10.1以关键码序列 (503, 087, 512, 061, 908, 170, 897, 275, 653, 426)为例,手工执行以下排序算法,写出每一趟排序结束时的关键码状态: (1)直接插入排序(2) 希尔排序(d[1]=5, d[2]=3, d[3]=1) (3) 快速排序(第一个记录为基准记录) (4) 堆排序 (5) 归并排序(6) 基数排序 解答: (1)直接插入排序: 第一趟: 087,503, 512, 061, 908, 170, 897, 275, 653, 426 第二趟: 087,503, 512, 061, 908, 170, 897, 275, 653, 426 第三趟: 061,087,503, 512, 908, 170, 897, 275, 653, 426 第四趟: 061,087,503, 512, 908, 170, 897, 275, 653, 426 第五趟: 061,087, 170, 503, 512, 908, 897, 275, 653, 426 第六趟: 061,087, 170, 275, 503, 512, 897, 908, 653, 426 第八趟: 061,087, 170, 275, 503, 512, 653, 897, 908, 426 第九趟: 061,087, 170, 275, 426, 503, 512, 653, 897, 908 (2)希尔排序 (d[1]=5, d[2]=3, d[3]=1) 第一趟: 170,087, 275, 061, 426, 503, 897, 512, 653, 908 第二趟: 061,087, 275, 170, 426, 503, 897, 512, 653, 908 第三趟: 061,087, 170, 275, 426, 503, 512, 653, 897, 908 (3) 快速排序(第一个记录为基准记录) 第一趟: (426,087,275,061,170) 503(897,908,653,512) 第二趟: (170, 087,275,061)426, 503(512,653)897(908) 第三趟: (061,087)170(275) 426, 503,512(653) 897, 908 第四趟: 061,087, 170, 275, 426, 503, 512, 653, 897, 908 (4) 堆排序(小根堆为例)

多路归并排序 外部排序算法

关于多路归并排序外部排序败者树技术积累2009-11-24 21:52:06 阅读453 评论0 字号:大中小 编程珠玑第一个case是有关一个技巧性解决外部排序问题的。问题很巧妙的解决了,但一开始提到的利用归并排序进行外部排序的算法仍值得仔细探究一下,毕竟本科时学的不是很深入。 先来看内部排序中最简单的2路归并排序算法。 算法核心操作是将一维数组中前后相邻的两个有序序列归并为一个有序序列,给定数组中序列界限i、m、n,用2个下标变量分别从i和j=m+1开始逐个往后处理,先比较,小的写到结果序列的当前遍历下标k中,相应下标自增继续比较直到某个序列的下标走到边界,再将另外一个序列的剩余元素拷贝到结果序列中。 算法可用递归或递推实现,从相邻的两两元素开始不断调用上面的核心操作组成较长有序序列直到完成整个序列。 算法进行一趟归并就得到一个局部有序的完整新序列,n个元素共需要log2n趟归并,每趟完成比较操作n次(1次得到序列的1个值),得到的新序列写到结果序列空间中,下一趟之前要先将结果序列复制一份到临时空间,下一趟归并在临时空间上进行。因此时间复杂度nlog2n,空间上除了原始序列空间n、结果序列空间n,还需要辅助临时空间n。 接下来看外部排序。外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装入内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行多路归并排序。 多路归并排序算法在常见数据结构书中都有涉及。从2路到多路(k路),增大k可以减少外存信息读写时间,但k个归并段中选取最小的记录需要比较k-1次,为得到u个记录的一个有序段共需要(u-1)(k-1)次,若归并趟数为s次,那么对n个记录的文件进行外排时,内部归并过程中进行的总的比较次数为s(n-1)(k-1),也即(向上取整)(logkm)(k-1)(n-1)=(向上取整)(log2m/log2k)(k-1)(n-1),而(k-1)/log2k随k增而增因此内部归并时间随k增长而增长了,抵消了外存读写减少的时间,这样做不行,由此引出了“败者树”tree of loser的使用。在内部归并过程中利用败者树将k个归并段中选取最小记录比较的次数降为(向上取整)(log2k)次使总比较次数为(向上取整)(log2m)(n-1),与k无关。 败者树是完全二叉树,因此数据结构可以采用一维数组。其元素个数为k个叶子结点、k-1个比较结点、1个冠军结点共2k个。ls[0]为冠军结点,ls[1]--ls[k-1]为比较结点,ls[k]--ls[2k-1]为叶子结点(同时用另外一个指针索引b[0]--b[k-1]指向)。另外bk为一个附加的辅助空间,不属于败者树,初始化时存着MINKEY的值。 多路归并排序算法的过程大致为:首先将k个归并段中的首元素关键字依次存入

相关主题
文本预览
相关文档 最新文档