问答题 有n个记录存储在带头结点的双向链表中,现用双向起泡排序法对其按上升序进行排序,请写出这种排序的算法(注:双向起泡排序即相邻两趟排序向相反方向起泡)。
【正确答案】正确答案:设head是带头结点的双向链表的指针,head一>next是向下起泡的开始结点,一趟起泡排序将最大元素下沉到链表尾;再设tail是向上起泡的开始结点,初始tail=null。在第一个最大元素沉到链表尾时,tail取链表倒数第二个结点的指针的值,这时向上起泡,得到最小值。如此下去,直到head等于tail或无交换为止,排序结束。核心语句段如下: exchange=1; tail=null; //tail是双向链表尾,算法过程中是向上起泡的开始结点 while(exchange) fp=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) //向上起泡,一趟有一最小元素冒出 head=P;//准备向下起泡 }//while(exchange)
【答案解析】