原创 非遞歸實現快速排序

非遞歸實現快速排序的方法和遞歸類似,其實所有的遞歸程序都能寫成非遞歸的形式,只要將隱式的棧改成顯示的棧即可。 void swap(int &in1, int &in2) { int tmp = in1; in1 = in2; in

原创 函數調用約定

在VC中,調用方式有__stdcall,__cdecl,__fastcall,thiscall幾種。其中前三種是一般調用所能使用的調用方式,thiscall是類對象調用成員函數時使用的調用方式,當在一個函數前使用__declspec(na

原创 圖的拓撲排序

無環有向圖可以進行拓撲排序,形象一點說就是,很多件有依賴關係的工作,怎麼安排才能一步步進行下去。 拓撲排序的思想很簡單,使用鄰接表存儲圖的話,拓撲排序在O(|V|+|E|)的時間內可以完成。下面介紹兩種拓撲排序方法。 1、簡單的拓撲排序

原创 變參函數剖析

變參函數定義形式如func(type a, …),要求至少一個固定參數,因爲需要通過這個參數來確定究竟有多少個參數、以及參數的類型。 windows中,變參函數用來獲取參數的幾個宏定義如下。 typedef char * va_lis

原创 單鏈表節點刪除問題

單鏈表的節點刪除一種保守的做法是從頭遍歷一遍,然後找到要刪除節點的前一個節點,修改next指針,最後釋放delete節點。實際上有些情況下可以在O(1)的時間內刪除節點! 如果節點指針被引用,那麼刪除單鏈表的節點就只能遍歷一遍來刪除了,否

原创 鄰接表表示圖

鄰接表表示圖是一種標準的做法,簡單的做法是使用鄰接矩陣,如下面的代碼所示。 #include <iostream> #include <string> #include <map> #include <queue> #include <

原创 TCP狀態轉換圖

+---------+ ---------\ active OPEN | CLOSED |

原创 按層遍歷二叉樹

按層遍歷二叉樹是廣度優先的算法,這個算法需要一個隊列,最開始將根節點入隊,然後處理隊列,直到隊列爲空,這樣就處理完了整棵樹。 好吧,看起來廣度優先遍歷是這麼的簡單,與深度優先不同,廣度優先使用隊列,見下面的代碼。處理一個節點時,如果該節點

原创 連連看遊戲中的最短路徑

連連看遊戲是一個比較簡單的遊戲,兩個相同的點可以消除,但前提是兩點之間的路徑不能有多於兩個折點。如何去求解兩個點之間的距離呢?我們可以將這裏的距離定義爲二元組(x,y),x表示多少次轉折,y表示路徑長度。x值越小距離越短,相同x值的情況下

原创 快速排序

快速排序的python實現。 # -*- coding:utf-8 -*- ''' qsort ''' def qsort_partition(A,p,r): x = A[r] i = p - 1 for j i

原创 二叉樹中節點的最大距離

二叉樹也是一個圖,雖然在一般的圖中求解簡單最長路徑問題非常困難,但是在二叉樹中卻比較簡單!我們甚至可以在線性時間內解決問題! 二叉樹中距離最長的兩個節點一定是葉子節點或根節點,假設有一個節點不是葉子節點或根節點,那麼其父親或者其兒子到另外

原创 輸出單鏈表的倒數第K個節點

求解單鏈表第K個節點或者倒數第K個節點總是一個O(n)的問題!一般的求解倒數第K個問題是轉換爲求解第N-K個節點的問題,這樣需要求出鏈表總長N,實際上可以做的更好! 求解倒數第K個節點更好的一種做法是不求解鏈表長度,使用一個指針指向第K個

原创 N!的末尾有多少個0?

N的階乘末尾有多少0呢?首先,得思考一下0到底是由哪些數貢獻的,顯而易見,一個2和5能貢獻一個0,然後我們只需要計算2和5的因子的個數即可,最後取最小值就是0的個數! N的階乘是從1到N的乘積,因子2的個數明顯多於5,只需要計算因子5的數

原创 重建二叉樹

二叉樹有前序、中序、後序三種遍歷方法,如果知道了其中兩種的遍歷結果,是不是就可以重建原來的二叉樹呢?當然這裏是有前提的,二叉樹的節點不能有相同的,不然有可能無法還原! 已知前序和中序 前序遍歷結果的第一個元素是原二叉樹的根,接下來的是左子

原创 就地翻轉單鏈表

翻轉單鏈表是比較簡單的事情,就像雙向鏈表插入節點一樣,關鍵在於指針的處理,除此之外沒有什麼值得關注的! #include <iostream> using namespace std; struct list { int value;