1.引言
2023年10月25~26日,包括筆者在內的十多位成員組隊參加了武漢原動力的野外拓展(outward bound)。在攀岩懸崖之前,教官組織了這樣的乙個遊戲專案:
教官將團隊裡的所有成員分開,然後用布條蒙上大家的眼睛,接著給每人乙個3位或4位的數字。他要求成員們蒙著眼睛集合,在不說話也看不到彼此的情況下,在限定的時間內,按所分得數字的大小順序排成一條線。
要成功地完成這個遊戲的確有相當的難度,成員們唯一可以借助的分辨彼此大小的手段可能是摸手指、拍肩膀或跺腳等,而要在限定的時間內分別出所有的大小並排成一條線卻依賴乙個好的排序演算法。 最後我們團隊失敗了,我們這群都有一定資料結構和演算法學習背景的所謂it人敗在了這個遊戲的面前。最後,教官對我們進行了一番「團隊合作精神如此重要」之類的教育云云。
本文對排序演算法的全面論述將從這個遊戲說開去,並用visual c++ 6.0編寫乙個示例工程以動畫演示這個遊戲中的成員以各種演算法實現成功排序的過程。排序演算法是資料結構學科的經典內容,也是電腦科學中最重要的研究問題之一。由於它的應用廣泛和固有的理論上的重要性,2023年它被列為對科學和工程計算的研究與實踐影響最大的10大問題之一。對於排序的研究既有理論上的重要意義,又有實際應用價值。它在計算機圖形、計算機輔助設計、機械人、模式識別、及統計學等領域具有廣泛應用。 常見的排序演算法有起泡排序、直接插入排序、簡單選擇排序、快速排序、堆排序等。在演示完各種排序演算法的動態過程後,本文將給出面對特定問題時選用合適排序演算法的原則。
2.演示工程
。以visual c++編寫乙個基於對話方塊的程式,我們假設待排序的隊員的總數為10,排序的整個過程為(每個步驟對應乙個選單):
(1)隊員分散:模擬教官將隊員分散開來的過程
對應的選單為:idm_disperse_member
選單標題為:隊員分散 (2)分配數字:模擬教官給每個隊員乙個3位或4位的數字的過程
對應的選單為:idm_creat_number
選單標題為:產生數字
(3)集合:所有成員在獲得數字後,為進行排序,他們需要先集合
對應的選單為:idm_muster_member
選單標題為:隊員集合
(4)排序:成員們依據摸手指、拍肩膀或跺腳等手段進行由小到大的排序,又依據排序演算法分為:
a.冒泡法
對應的選單為:idm_bubble_sort
b.交換排序
對應的選單為:idm_exchange_sort
c.選擇排序
對應的選單為:idm_selection_sort
d.插入排序
對應的選單為:idm_insert_sort
e.快速排序
對應的選單為:idm_quick_sort
整個對話方塊的訊息對映關係為:
begin_message_map ( csortdlg, cdialog )
//}afx_msg_map
end_message_map()
「隊員分散」實現的功能是將10個成員均勻分散在乙個大圓周上(以乙個小正方形模擬乙個成員,這些成員的名字為0~9),其源**為:
void csortdlg::ondispersemember()
}圖1給出了隊員分散後的顯示結果。
圖1 隊員分散
「分配數字」實現的是給每個成員隨機的分配乙個3位或4位的數字,其源**為:
void csortdlg::oncreatnumber()
sortobject[i].inumber = temp % 1000;
}else
//產生4位數
sortobject[i].inumber = temp % 10000;
}//初始化序號和名稱
sortobject[i].iname = i;
sortobject[i].iseq = i;
//顯示獲得的數字
cstring strnum;
strnum.format("%4d", sortobject[i].inumber);
dc.textout(rect.right / 2+150 * cos(2 *pi * i / 10.0) - 15, rect.bottom / 2+150 * sin(2 *pi * i / 10.0) - 30, strnum);}}
圖2給出了分配數字後的顯示結果。
圖3 隊員集合
上述csortdlg::oncreatnumber()及csortdlg::onmustermember()函式中用到的sortobject定義為:
sortobject sortobject[sort_object_num];
即sortobject陣列,而sortobject的含義則為待排序的成員,其定義為:
typedef struct tagsortobject
sortobject;
共6頁。
1
2
3
4
5
6 8
:
用Python實現八大排序演算法 氣泡排序
冒泡重複地走訪過要排序的數列,一次比較兩個元素,如果他們的順序錯誤就把他們交換過來。走訪數列的工作是重複地進行直到沒有再需要交換,也就是說該數列已經排序完成。氣泡排序 defbubble sort lists count len lists for i in range 0,count for j ...
用Python實現八大排序演算法 快速排序
一 概述 最近在用python學習經典的8大排序演算法,以鞏固基礎知識,同時強化自己的python技能。下面對快速排序做乙個簡要介紹。快速排序 設要排序的陣列是a 0 a n 1 首先任意選取乙個資料 通常選用陣列的第乙個數 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面...
用Python實現八大排序演算法 堆排序
1.堆是一種資料結構 可以將堆看作一棵完全二叉樹,這棵二叉樹滿足,任何乙個非葉節點的值都不大於 或不小於 其左右孩子節點的值。2.堆的儲存 一般用陣列來表示堆,若根節點存在於序號0處,i結點的父結點下表就為 i 1 2,i結點的左右子結點下標分別為2i 1和2i 2 3.堆排序思想 利用大頂堆 小頂...