C++基礎代碼--20余種數據結構和算法的實現


C++基礎代碼--20余種數據結構和算法的實現

  過年了,閑來無事,翻閱起以前寫的代碼,無意間找到了大學時寫的一套C++工具集,主要是關於數據結構和算法、以及語言層面的工具類。過去好幾年了,現在幾乎已經回憶不起當年寫代碼時的情況,不過,通過文件頭部注釋里的日期,還是依稀想起了那些日子發生的一些事情,不禁感慨了一番。感概之余,隨便翻閱了一下,發現當年的編程手法和現在相比,略顯稚嫩,風格也相差的比較大了,明顯受到當時讀的一些經典C++書籍的影響。不過好在代碼質量都算可以,都屬於基礎的語言層面以及數據結構的代碼,操作指針比較小心,每個類也都有測試的樣例,感覺對初學者應該會有用,於是拿到這里放出來,希望能對准備學習和正在學習C++語言編程的朋友有所裨益。

做了個表,看一下這個工具集里都有哪些C++類

    

  基本上可以分為兩大類,一種是關於數據結構和算法的(例如:RBtree,stack),另一種是關於C++語言本身層面的(例如:reference_count,Uncopyable)。這些類,可以在如今C++標准庫或者其它C++庫(如:boost)中找到類似的實現,實現它們的目的不是想自己造輪子,而是通過實現,來深入的理解到一些更本質的東西。很多時候,人們往往“知其然,不知其所以然”,當然,世界這么大,什么事情都想要“知其所以然”是不可能、也是不應該的,但是對於初學者而言,了解C++中常用的編程手法的本質,“知其所以然”,還是很必要的。

  如果想在自己的項目中使用這些代碼,有的地方還是需要注意和考慮一下的,比如Auto_ptr,它的原理仿照std::auto_ptr,當然,現在已經不推薦使用了,更應該使用std::unique_ptr或std::shared_ptr,而Uncopyable也可以通過更為方便的宏定義來實現,只需要在類定義private域中加入該宏即可。

1 #define DISABLE_COPY_AND_ASSIGN(type_name) \
2 type_name(const type_name&); \
3 type_name& operator=(const type_name&)

  

  這里我把其中的兩個基礎算法——sorting中的“插入排序”和“快速排序”貼出來,估計一些要參加筆試和面試的朋友可能會感興趣。

 1 //-------------insertion sort-------------------------
2 template<typename T>
3 void insertion_sort(T a[], int n)
4 {
5 T tm;
6 for (int i=0; i!=n; ++i) {
7 tm = a[i];
8 int k=i;
9 for (; k>0; --k) {
10 if (tm >= a[k-1])
11 break;
12 a[k] = a[k-1];
13 }
14 a[k] = tm;
15 }
16 }
17 //---------------------------------------------------
 1 //------------------quick sort----------------------
2 template<typename T>
3 T median(T a[], int left, int right)
4 {
5 int center = (left + right) / 2;
6 T tm;
7 if (a[left] > a[center]) {
8 tm = a[left];
9 a[left] = a[center];
10 a[center] = tm;
11 }
12 if (a[left] > a[right]) {
13 tm = a[left];
14 a[left] = a[right];
15 a[right] = tm;
16 }
17 if (a[center] > a[right]) {
18 tm = a[center];
19 a[center] = a[right];
20 a[right] = tm;
21 }
22
23 tm = a[center];
24 a[center] = a[right-1];
25 a[right-1] = tm;
26
27 return a[right-1];
28 }
29
30 template<typename T>
31 void q_sort(T a[], int left, int right)
32 {
33 // 如果剩余未排序的數組長度太小,使用插入排序算法進行剩余數組的排序
34 if (left+4 <= right) {
35 T pivot = median(a,left,right);
36 int i = left;
37 int j = right - 1;
38 while (true) {
39 while (a[++i] < a[pivot]);
40 while (a[--j] > a[pivot]);
41 if (i < j) {
42 T tm = a[i];
43 a[i] = a[j];
44 a[j] = tm;
45 }
46 else
47 break;
48 }//while
49 T tm = a[i];
50 a[i] = a[right-1];
51 a[right-1] = tm;
52
53 q_sort(a,left,i-1);
54 q_sort(a,i+1,right);
55 }
56 else
57 insertion_sort(a+left,right-left+1);
58 }
59
60 template<typename T>
61 void quicksort(T a[], int n)
62 {
63 q_sort(a,0,n-1);
64 }
65 //--------------------------------------------------


下載地址:http://files.cnblogs.com/haibindev/data_structures_and_algorithms.7z


免責聲明!

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



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