數據結構學習總結算法設計---排序


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 `
現在時22時54分 你今天過的開心嗎?如果不開心記得早點睡覺 明天醒來又是活力滿滿的一天哦 我也要勇敢的奔赴考研的戰場了。加油


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM