hi,你好啊 今天是11月4號 大概這一次真的要結束了。但學習的道路是不會停下的哦。
(1)若一組記錄的排序碼為(46, 79,56,38,40,84),則利用
快速排序的方法,以第一個記錄為基准得到的一次划分結果為
( )。
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
答案:C
分析:這個題主要考察快速排序的方法 記得將中心點放置於監視哨 從后面找比中心點小的 ,后面空出位置后記得從前面找比中心點大的數字。
(11)若一組記錄的排序碼為(46,79,56,38,40,84),則利用
堆排序的方法建立的初始堆為( )。
A.79,46,56,38,40,84 B.84,79,56,38,
40,46
C.84,79,56,46,40,38 D.84,56,79,40,
46,38
答案:B
分析:按照排序碼建立一棵樹 然后建立大根堆或者小根堆進行排序
(1)設待排序的關鍵字序列為{12,2,16,30,28,10,16*,20,
6,18},試分別寫出使用以下排序方法,每趟排序結束后關鍵字序
列的狀態。
① 直接插入排序
② 折半插入排序 [mid=(low+high)/2]
③ 希爾排序(增量選取 5,3,1)
④ 冒泡排序
⑤ 快速排序 (重點掌握 注意掌握方法)
⑥ 簡單選擇排序
⑦ 堆排序
⑧ 二路歸並排序
(3)對輸入文件(101,51,19,61,3,71,31,17,19,100,
55,20,9,30,50,6,90);當 k=6 時,使用置換-選擇算法,寫
出建立的初始敗者樹及生成的初始歸並段

初始歸並段:R1:3,19,31,51,61,71,100,101
R2:9,17,19,20,30,50,55,90
R3:6
算法
(1)試以單鏈表為存儲結構,實現簡單選擇排序算法。
`[算法描述]:
void LinkedListSelectSort(LinkedList head)
//本算法一趟找出一個關鍵字最小的結點,其數據和當前結點進行交換;若要交換指針,則須記下//當前結點和最小結點的前驅指針
p=head->next;
while(p!=null)
{q=p->next; r=p; //設 r 是指向關鍵字最小的結點的指針
while (q!=null)
{if(q->data<r->data) r=q;
q:=q->next;
}
if(r!=p) r->data<-->p->data;
p=p->next;}`
(2)有 n 個記錄存儲在帶頭結點的雙向鏈表中,現用雙向冒泡排序
法對其按上升序進行排序,請寫出這種排序的算法。(注:雙向冒泡
排序即相鄰兩趟排序向相反方向冒泡)。
`typedef struct node
{ ElemType 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)
} //算法結束`
(5)借助於快速排序的算法思想,在一組無序的記錄中查找給定關
鍵字值等於 key 的記錄。設此組記錄存放於數組 r[l..n]中。若查
找成功,則輸出該記錄在 r 數組中的位置及其值,否則顯示“not
find”信息。請簡要說明算法思想並編寫算法。
分析:把待查記錄看作樞軸,先由后向前依次比較,若小於樞
軸,則從前向后,直到查找成功返回其位置或失敗返回 0 為止
`int index (RecType R[],int l,h,datatype key)
{int i=l,j=h;
while (i<j)
{ while (i<=j && R[j].key>key) j--;
if (R[j].key==key) return j;
while (i<=j && R[i].key<key) i++;
if (R[i].key==key) return i;
}
cout<<“Not find”; return 0;
}//index `
