更新时间: 试题数量: 购买人数: 提供作者:

有效期: 个月

章节介绍: 共有个章节

收藏
搜索
题库预览
有n个记录存储在带头结点的双向链表中,现用双向冒泡排序法对其按上升序进行排序,请写出这种排序的算法。(注:双向冒泡排序即相邻两趟排序向相反方向冒泡。) [算法描述:] typedef struct node { ElementType data; struct node *prior,*next; }node, *DLinkedList; void TwoWayBubbleSort(DLinkedList la) //对存储在带头结点的双向链表la中的元素进行双向冒泡排序。 {int exchange=1; //设交换标志 DLinkedList p,temp,tail; head=la; //双向链表头,算法过程中是向下冒泡的开始点 tail=null; //双向链表尾,算法过程中是向上冒泡的开始点 while (exchange) {p=head->next; //p是工作指针,指向当前结点 exchange=0; //假定本趟无交换 while (p->next!=tail) //向下(右)冒泡,一趟有一最大元素沉底 {if (p->data>p->next->data) //交换两结点指针,涉及6条链 {temp=p->next; exchange=1;//有交换 p->next=temp->next; temp->next->prior=p; //先将结点从链表上摘下 temp->next=p; p->prior->next=temp; //将temp插到p结点前 temp->prior=p->prior; p->prior=temp; } else p=p->next; //无交换,指针后移 } tail=p; //准备向上冒泡 p=tail->prior; while (exchange && p->prior!=head) //向上(左)冒泡,一趟有一最小元素冒出 {if (p->data>p->prior->data) //交换两结点指针,涉及6条链 {temp=p->prior; exchange=1; //有交换 p->prior=temp->prior; temp->prior->next=p; //先将temp结点从链表上摘下 temp->prior=p; p->next->prior=temp;//将temp插到p结点后(右) temp->next=p->next; p->next=temp; } else p=p->prior; //无交换,指针前移 } head=p; //准备向下冒泡 } //while (exchange) } //算法结束
设有顺序放置的n个桶,每个桶中装有一粒砾石,每粒砾石的颜色是红,白,蓝之一。要求重新安排这些砾石,使得所有红色砾石在前,所有白色砾石居中,所有蓝色砾石居后,重新安排时对每粒砾石的颜色只能看一次,并且只允许交换操作来调整砾石的位置。 [题目分析]时用快速排序的思想。由于要求,并且每粒砾石的颜色只能看一次,设置3个指针i,j和k,分别指向红色、白色砾石的后一位置和待处理的当前元素。从k=n开始,从右向左搜索,若该元素是兰色,则元素不动,指针左移(即k-1);若当前元素是红色砾石,分i=j(这时尚没有白色砾石)和i<j两种情况。前一情况执行第1个元素和第k个元素交换,之后i++;后一情况,i所指的元素已处理(白色),j所指的元素尚未处理,应先将i和j所指元素交换,再将i和k所指元素交换。对当前元素是白色砾石的情况,也可类似处理。 为方便处理,将三种砾石的颜色用整数1、2和3表示。 [算法描述:] void QkSort(rectype r[], int n) { // r为含有n个元素的线性表,元素是具有红、白和兰色的砾石,用顺序存储结构存储, //本算法对其排序,使所有红色砾石在前,白色居中,兰色在最后。 int i=1,j=1,k=n,temp; while (k>=j){ while (k>=j && r[k].key==3) k--;// 当前元素是兰色砾石,指针左移 if (r[k].key==1) // 当前元素是红色砾石 if (i==j) {temp=r[k];r[k]=r[i];r[i]=temp; i++;} //左侧只有红色砾石,交换r[k]和r[i] else {temp=r[j];r[j]=r[i];r[i]=temp; j++; //左侧已有红色和白色砾石,先交换白色砾石到位 temp=r[k];r[k]=r[i];r[i]=temp; i++; //再交换r[k]和r[i],使红色砾石入位。 } if (r[k].key==2) if (i<=j) { temp=r[k];r[k]=r[j];r[j]=temp; j++;} else { temp=r[k];r[k]=r[j];r[j]=temp; j++;} //i、j分别指向红、白色砾石的后一位置 }//while if (r[k].key==2) j++; //*处理最后一粒砾石 else if (r[k].key==1) { temp=r[i];r[i]=r[k];r[k]=temp; i++; j++;} //最后红、白、兰色砾石的个数分别为: i-1;j-i;n-j+1 }//结束QkSort算法 [算法讨论]若将j(上面指向白色)看作工作指针,将r[1..j-1]作为红色,r[j..k-1]为白色,r[k..n]为兰色。从j=1开始查看,若r[j]为白色,则j++; 若r[j]为红色,则交换r[j]与r[i],且j=j+1,i=i+1; 若r[j]为兰色,则交换r[j]与r[k];k=k-1。算法进行到j<=k为止。算法片段如下: int i=1,j=1,k=n; while(j<=k) if (r[j].key==1) //当前元素是红色 {temp=r[i]; r[i]=r[j]; r[j]=temp; i++;j++;} else if (r[j].key==2) j++; //当前元素是白色 else //r[j].key==3 当前元素是兰色 {temp=r[j]; r[j]=r[k]; r[k]=temp; k--;} 对比两种算法,可以看出,正确选择变量(指针)的重要性。