上一週自學:
數據結構:本來打算是排序,沒想到順便把查找也看完了
排序分爲
插入排序:直接插入,折半插入,shell
每次選擇待排序的記錄序列的第一個記錄,按照排序碼的大小將其插入到已排序的記錄序列中的適當位置,直到所有記錄全部排序完畢;
選擇排序:直接選擇,樹形選擇
每次從待排序的記錄中選出排序碼最小的記錄,再在剩下的記錄中選出最小的記錄,重複這個選擇過程,直到完成全部排序;
交換排序:起泡,快速
每次將待排序文件中的兩個記錄的排序碼進行比較,如果不滿足排序要求,則交換這兩個記錄在文件中的順序,直到文件中任意兩個記錄之間都滿足排序要求爲止;
分配排序:基數排序
歸併排序:
將已經排序的子文件進行合併,得到完全排序的文件;
外部排序:2路合併,多路替代選擇合併,最佳合併
按平均時間將排序分爲四類:
(1)平方階(O(n2))排序
一般稱爲簡單排序,例如直接插入、直接選擇和冒泡排序;
(2)線性對數階(O(nlgn))排序
如快速、堆和歸併排序;
(3)O(n1+£)階排序
£是介於0和1之間的常數,即0<£<1,如希爾排序;
(4)線性階(O(n))排序
如桶、箱和基數排序。
各種排序方法比較
簡單排序中直接插入最好,快速排序最快,當文件爲正序時,直接插入和冒泡均最佳
影響排序效果的因素
因爲不同的排序方法適應不同的應用環境和要求,所以選擇合適的排序方法應綜合考慮下列因素:
①待排序的記錄數目n;
②記錄的大小(規模);
③關鍵字的結構及其初始狀態;
④對穩定性的要求;
⑤語言工具的條件;
⑥存儲結構;
⑦時間和輔助空間複雜度等。
不同條件下,排序方法的選擇
(1)若n較小(如n≤50),可採用直接插入或直接選擇排序。
當記錄規模較小時,直接插入排序較好;否則因爲直接選擇移動的記錄數少於直接插人,應選直接選擇排序爲宜。
(2)若文件初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序爲宜;
(3)若n較大,則應採用時間複雜度爲O(nlgn)的排序方法:快速排序、堆排序或歸併排序
查找:
順序查找:
將每個結點的關鍵碼和給定的待查的關鍵碼值進行比較,直到找出相等的結點或者找遍所有結點;
折半查找:
首先找到表的中間結點,將其關鍵碼與給定的要找的值進行比較,若相等,則查找成功;若當前結點的關鍵碼大於要找的值,則繼續在表的前半部分進行折半查找,否則繼續在表的後半部分進行折半查找;
分塊查找:
散列查找:(hash)
C++:
第十三章,類繼承
多態公有繼承:
class A { fun()}
class B:public A {fun()}
A a; B b;
A &ab = b;
ab.fun(); //A::fun
class A { virtual fun()}
class B:public A {fun()}
A a; B b;
A &ab = b;
ab.fun(); //B::fun 靠,還好今天討論了一下,不然完全相反了
編譯器對非虛擬方法使用靜態聯編(static binding , or early binding)
對虛擬方法使用動態聯編(dynamic binding, or late binding)
構造函數不能爲虛函數,析構函數可以爲虛函數,當類作爲基類時,析構函數應該是虛擬函數;友元不能是虛擬函數;
重新定義繼承的方法並不是重載,如果在派生類中重新定義函數,將不是使用相同的函數特徵標覆基類聲明,而是隱藏同名的基類方法,不管參數特徵標如何;1.如果重新定義繼承的方法,應確保與原來的原型完全相同,但如果返回類型是基類引用或指針,則可以修改爲指向派生類的引用或指針;2.如果基類聲明被重載了,則應在派生類中重新定義所有的基類版本;
windows API:
進程,線程,纖程:
纖程也是程序執行單元,與線程類似.所不同的是纖程必須要應用程序自行調度,而線程是由系統進行調度的.纖程運行於線程的上下文中,一個線程可以調度很多纖程;
線程同步:
http://blog.csdn.net/asmemgsd/archive/2010/09/13/5881962.aspx