知识大全 第8章排序(算法设计)习题练习答案
Posted 结点
篇首语:风华是一指流砂,苍老是一段年华。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 第8章排序(算法设计)习题练习答案相关的知识,希望对你有一定的参考价值。
将哨兵放在R[n]中 被排序的记录放在R[ n ]中 重写直接插入排序算法 解 重写的算法如下 void InsertSort(SeqList R) //对顺序表中记录R[ n ]按递增序进行插入排序 int i j; for(i=n ;i>= ;i ) //在有序区中依次插入R[n ] R[ ] if(R[i] key>R[i+ ] key) //若不是这样则R[i]原位不动 R[n]=R[i];j=i+ ; //R[n]是哨兵 do //从左向右在有序区中查找插入位置 R[j ]=R[j]; //将关键字小于R[i] key的记录向右移 j++; while(R[j] key<R[n] key]); R[j ]=R[n]; //将R[i]插入到正确位置上 //endif //InsertSort
以单链表作为存储结构实现直接插入排序算法 解 #define int KeyType //定义KeyType 为int型 typedef struct node KeyType key; //关键字域 OtherInfoType info; //其它信息域 struct node * next; //链表中指针域 RecNode; //记录结点类型 typedef RecNode * LinkList ; //单链表用LinkList表示 void InsertSort(LinkList head) //链式存储结构的直接插入排序算法 head是带头结点的单链表 RecNode *p *q *s; if ((head >next)&&(head >next >next))//当表中含有结点数大于 p=head >next >next;//p指向第二个节点 head >next=NULL; q=head;//指向插入位置的前驱节点 while(p)&&(q >next)&&(p >key<q >next >key) q=q >next; if (p) s=p;p=p >next;// 将要插入结点摘下 s >next=q >next;//插入合适位置 q结点后 q >next=s;
设计一算法 使得在尽可能少的时间内重排数组 将所有取负值的关键字放在所有取非负值的关键字之前 请分析算法的时间复杂度 解 因为只需将负数关键字排在前面而无需进行精确排列顺序 因此本算法采用两端扫描的方法 就象快速排序采用的方法一样 左边扫描到正数时停止 开始扫描右边 遇到负数时与左边的当前记录交换 如此交替进行 一趟下来就可以完成排序 void ReSort(SeqList R) //重排数组 使负值关键字在前 int i= j=n; //数组存放在R[ n]中 while (i<j) //i<j表示尚未扫描完毕 while(i<j&&R[i] key< ) //遇到负数则继续扫描 i++; R[ ]=R[i]; //R[ ]为辅助空间 while(i<j&&R[j] key>= )// 遇到正数则继续向左扫描 j ; R[i++]=R[j];R[j ]=R[ ];//交换当前两个元素并移动指针 //endwhile //ReSort 本算法在任何情况下的比较次数均为n(每个元素和 )相比 交换次数少于n/ 总的来说 时间复杂度为O(n)
* 写一个双向冒泡排序的算法 即在排序过程中交替改变扫描方向 解 算法如下 void BubbleSort(SeqList R) //R[ n]是待排序文件 双向扫描冒泡排序 int i j k; Boolean exchange; //交换标记 i=n;j= ; exchange=TRUE; while (i>j)&&(exchange) k=i ;exchange=FALSE; while (k>=j)//由下往上扫描 if (r[k]>r[k+ ]) r[ ]=r[k];r[k]=r[k+ ];r[k+ ]=r[k];exchange=TRUE;//交换 //endif k ; //endwhile if (exchange) exchange=FALSE; j++;k=j+ ; while(k<=i)//由上往下扫描 if (r[k]<r[k ]) r[ ]=r[k];r[k]=r[k ];r[k ]=r[k];exchange=TRUE;//交换 //endif k++; endwhile i ; //endif endwhile //endsort
下面是一个自上往下扫描的冒泡排序的伪代码算法 它采用lastExchange 来记录每趟扫描中进行交换的最后一个元素的位置 并以它作为下一趟排序循环终止的控制值 请仿照它写一个自下往上扫描的冒泡排序算法 void BubbleSort(int A[] int n) //不妨设A[ n ]是整型向量 int lastExchange j i=n ; while (i> ) lastExchange= ; for(j= ;j<i;j++)//从上往下扫描A[ i] if(A[j+ ]<A[j]) 交换A[j]和A[j+ ]; lastExchange=j; i=lastExchange;//将i置为最后交换的位置 //endwhile//BubbleSort 解 算法如下 void BubbleSort(int A[] int n) //不妨设A[ n ]是整型向量 int lastExchange j i= ; while (i<n) //这一条很重要 如不改为这样 算法将无限循环下去 lastExchange=n; for(j=n ;j>i;j )//从下往上扫描A[ i] if(A[j ]<A[j]) 交换A[j]和A[j ]; lastExchange=j; i=lastExchange;//将i置为最后交换的位置 //endwhile//BubbleSort
改写快速排序算法 要求采用三者取中的方式选择划分的基准记录 若当前被排序的区间长度小于等于 时 无须划分而是直接采用直接插入方式对其排序 解 改写后的算法如下 void QuickSort(SeqList R int low int high) //对R[low high]快速排序 int pivotpos; if(high low<= )//若当前区内元素少于 个 //则进行直接插入排序 InsertSort(R low high); else pivotpos=midPartion(R low high); QuickSort(R low pivotpos ); QuickSort(R pivotpos+ high); //QuickSort int midPartion(SeqList R int i int j) //三者取中规则定基准 if(R[(i+j)/ ] key>R[i] key) 交换R[(i+j)/ ]和R[i]; if(R[i] key>R[j] key) 交换R[i]和R[j]; if(R[i] key)<R[(i+j)/ ] key) 交换R[i]和R[(i+j)/ ]; //以上三个if语句就使区间的第一个记录的key值为三个key的中间值 return Partion(R i j);//这样我们就可以仍使用原来的划分算法了
对给定的j( ≤j≤n ) 要求在无序的记录区R[ n]中找到按关键字自小到大排在第j个位置上的记录(即在无序集合中找到第j个最小元) 试利用快速排序的划分思想编写算法实现上述的查找操作 答 int QuickSort(SeqList R int j int low int high) //对R[low high]快速排序 int pivotpos //划分后的基准记录的位置 if(low<high)//仅当区间长度大于 时才须排序 pivotpos=Partition(R low high) //对R[low high]做划分 if (pivotpos==j) return r[j]; else if (pivotpos>j) return(R j low pivotpos ); else return quicksort(R j pivotpos+ high); //QuickSort
以单链表为存储结构 写一个直接选择排序算法 答 #define int KeyType //定义KeyType 为int型 typedef struct node KeyType key; //关键字域 OtherInfoType info; //其它信息域 struct node * next; //链表中指针域 RecNode; //记录结点类型 typedef RecNode * LinkList ; //单链表用LinkList表示 void selectsort(linklist head) RecNode *p *q *s; if(head >next)&&(head >next >next) p=head >next;//p指向当前已排好序最大元素的前趋 while (p >next) q=p >next;s=p; while(q) if (q >key<s >key) s=q; q=q >next; //endwhile 交换s结点和p结点的数据 p=p >next; //endwhile //endif //endsort
相关参考
以关键字序列()为例分别写出执行以下排序算法的各趟排序结束时关键字序列的状态 ()直接插入排序()希尔排序()冒泡排序()快速排序 ()直接选择排序()堆排序()归并排序()基数排序 上述方法中哪些
以关键字序列()为例分别写出执行以下排序算法的各趟排序结束时关键字序列的状态 ()直接插入排序()希尔排序()冒泡排序()快速排序 ()直接选择排序()堆排序()归并排序()基数排序 上述方法中哪些
知识大全 严蔚敏《数据结构(c语言版)习题集》算法设计题第十章答案
第九章查找第十章内部排序 voidInsert_Sort(SqList&L)//监视哨设在高下标端的插入排序算法 k=Llength; for(i=k;i;i)//从后向前逐
*二叉树的遍历算法可写为通用形式例如通用的中序遍历为 voidInorder(BinTreeTvoid(*visit)(DataTypex)) if(T) Inorder(T>lchil
二算法设计题 将哨兵放在R[n]中被排序的记录放在R[n]中重写直接插入排序算法 解重写的算法如下因为哨兵换了位置所以一切都反向了有序区是从右边长出来的; voidInsertSort(Se
*二叉树的遍历算法可写为通用形式例如通用的中序遍历为 voidInorder(BinTreeTvoid(*visit)(DataTypex)) if(T) &nbs
试在无向图的邻接矩阵和邻接链表上实现如下算法 ()往图中插入一个顶点 ()往图中插入一条边 ()删去图中某顶点 ()删去图中某条边下面的伪代码是一个广度优先搜索算法试以图(下图)中的v为源点
常见的文件组织方式有哪几种?各有何特点?文件上的操作有哪几种?如何评价文件组织的效率?答 常用的文件组织方式有顺序文件索引文件散列文件和多关键字文件 ●顺序文件的
试描述头指针头结点开始结点的区别并说明头指针和头结点的作用答 开始结点是指链表中的第一个结点也就是没有直接前趋的那个结点 链表的头指
对含有n个互不相同元素的集合同时找最大元和最小元至少需进行多少次比较? 答 设变量max和min用于存放最大元和最小元(的位置)第一次取两个元素进行比较大的放入max小的放入min从第次开