排序常用算法设计

2019-06-17 18:08

第8 章排序(算法设计)习题练习答案

13. 将哨兵放在R[n]中,被排序的记录放在R[0..n-1]中,重写直接插入排序算法。

解: 重写的算法如下: void InsertSort(SeqList R)

{//对顺序表中记录R[0..n-1]按递增序进行插入排序 int i,j;

for(i=n-2;i>=0;i--) //在有序区中依次插入R[n-2]..R[0] 课后答案网 www.khdaw.com

if(R[i].key>R[i+1].key) //若不是这样则R[i]原位不动 {

R[n]=R[i];j=i+1; //R[n]是哨兵

do{ //从左向右在有序区中查找插入位置 R[j-1]=R[j]; //将关键字小于R[i].key 的记录向右移 j++;

}while(R[j].key

R[j-1]=R[n]; //将R[i]插入到正确位置上 }//endif }//InsertSort.

14.以单链表作为存储结构实现直接插入排序算法。 解: #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))//当表中含有结点数大于1 {

p=head->next->next;//p 指向第二个节点 head->next=NULL;

q=head;//指向插入位置的前驱节点

while(p)&&(q->next)&&(p->keynext->key) q=q->next; if (p)

课后答案网 www.khdaw.com

{s=p;p=p->next;// 将要插入结点摘下 s->next=q->next;//插入合适位置:q 结点后 q->next=s; } }

}

15.设计一算法,使得在尽可能少的时间内重排数组,将所有取负值的关键字放在所有取非

负值的关键字之前。请分析算法的时间复杂度。

解: 因为只需将负数关键字排在前面而无需进行精确排列顺序,因此本算法采用两端扫

描的方法,就象快速排序采用的方法一样,左边扫描到正数时停止,开始扫描右边,遇到负

数时与左边的当前记录交换,如此交替进行,一趟下来就可以完成排序。

void ReSort(SeqList R)

{//重排数组,使负值关键字在前 int i=1,j=n; //数组存放在R[1..n]中 while (i

{ while(i

R[0]=R[i]; //R[0]为辅助空间

while(i=0)// 遇到正数则继续向左扫描 j--;

R[i++]=R[j];R[j--]=R[0];//交换当前两个元素并移动指针 }//endwhile }//ReSort

本算法在任何情况下的比较次数均为n(每个元素和0)相比,交换次数少于n/2,总的来 说,时间复杂度为O(n).

*16.写一个双向冒泡排序的算法,即在排序过程中交替改变扫描方向。 解: 算法如下: void BubbleSort(SeqList R) 课后答案网 www.khdaw.com

{//R[1..n]是待排序文件,双向扫描冒泡排序 int i,j,k;

Boolean exchange; //交换标记 i=n;j=1; exchange=TRUE; while (i>j)&&(exchange) {k=i-1;exchange=FALSE; while (k>=j)//由下往上扫描 {if (r[k]>r[k+1])

{r[0]=r[k];r[k]=r[k+1];r[k+1]=r[k];exchange=TRUE;//交换 }//endif k--; }//endwhile if (exchange) {exchange=FALSE;

j++;k=j+1;

while(k<=i)//由上往下扫描 {if (r[k]

{r[0]=r[k];r[k]=r[k-1];r[k-1]=r[k];exchange=TRUE;//交换 }//endif k++; }endwhile i--; }//endif }endwhile }//endsort

17.下面是一个自上往下扫描的冒泡排序的伪代码算法,它采用lastExchange 来记录每趟扫

描中进行交换的最后一个元素的位置,并以它作为下一趟排序循环终止的控制值。请仿照

它写一个自下往上扫描的冒泡排序算法。 课后答案网 www.khdaw.com void BubbleSort(int A[],int n) //不妨设A[0..n-1]是整型向量 int lastExchange,j,i=n-1; while (i>0) lastExchange=0;


排序常用算法设计.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:关于数字文化馆建设发展方向的调研报告

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: