原创 “作爲函數參數的二維數組”即“怎麼給函數傳二維數組的指針”

剛纔在百度知道看到了這個問題,回答了下,這個問題很好,總結一下。 聲明一個二維數組 int matrix[100][100]; 當把二維數組作爲參數傳遞的時候很多人可能一上來就這樣寫intfun(int  **matrix),這樣寫是沒

原创 第八章線形時間排序之“計數法排序COUNTING-SORT”

這個方法很牛逼,這個排序方法不再像前面那些排序方法一樣根據比較來進行。 時間複雜度爲O(k+n+k+n+n)=O(n),當k=O(n)時,可以保證時間複雜度爲O(n),就可以用計數法來進行排序了。 這個方法的一個前提是必須要知道要排序的數

原创 第八章線性時間排序之“基數排序RADIX-SORT”(練習8.3-1)

利用基數排序對a[17][4]={"   ","COW","DOG","SEA","RUG","ROW","MOB","BOX","TAB","BAR","EAR","TAR","DIG","BIG","TEA","NOW","FOX"}

原创 第六章堆排序之“最小優先級隊列”(練習6.5-3)

用最小堆實現最小優先級隊列: //返回堆中關鍵字最小的元素 HeapMinimum() //去掉並返回堆中關鍵字最小的元素 HeapExtractMin() //將堆中元素x的關鍵字減小到k,k要小於x原來的關鍵字值 HeapDecrea

原创 第六章堆排序之“堆排序HEAPSORT”

(1)先用BuildMaxHeap()建立最大堆 (2)交換a[1]和a[heapSize],把最大的換到最後 (3)堆大小heapSize減1 (4)因爲將最後一個元素換到堆頂可能會破壞堆的性質,所以調用MaxHeapIfy()將新的h

原创 第六章堆排序之“Young氏矩陣(Young tableau)”(思考題6-3)

這個程序是利用Young氏矩陣爲n*n的數組排序。 其中涉及到:插入法建立Young氏矩陣,然後再調用”去掉返回堆頂元素”的函數得到從小到大的排列。總的時間複雜度爲O(n^3)。 其中向Young氏矩陣“插入一個元素”的時間複雜度爲O(m

原创 第六章堆排序之“建堆BUILD-MAX-HEAP”(迭代版)

自下向上對每一個結點或者只對每個非葉結點使用“保持堆的性質”即“堆調整”MAX-HEAPIFY #include <stdio.h> #include <string.h> #include <time.h> #define BUFF

原创 第七章快速排序之“區間模糊排序FUZZY-SORT”(待改進。。。)

快速排序可以看成區間大小爲1的模糊排序。 #include <string.h> #include <time.h> #define BUFFER_SIZE 10 typedef struct { int start; int e

原创 第六章堆排序之“刪除最大堆中的指定元素HEAP-DELETE”(練習6.5-7)

題目:HEAP-DELETE(A,i)操作將節點i中的項從堆中刪去。對含n個元素的最大堆,請給出時間爲O(lgn)的HEAP-DELETE的實現。 編程思路: 我們可以用堆中最後一個元素a[heapSize]放到節點i 位置,然後將hea

原创 第六章堆排序之“最大優先級隊列”

用最大堆實現最大優先級隊列: //返回堆的最大值 int HeapMaximum(int *a) //去掉並返回堆中具有最大關鍵字的元素 int HeapExtractMax(int *a,int *heapSize) //將元素x的關鍵

原创 第六章堆排序之“優先級隊列實現先進先出隊列和棧”(練習6.5-6)

這個不寫代碼了。 思路如下: 首先要先明確優先級是誰?優先級隊列嘛,當然最重要的是要先知道“優先級”是誰,才能按它排序。 這裏的優先級就是進出隊的次序。 (1)優先級隊列實現先進先出隊列 先進隊的優先級更高,賦予每個進隊的元素一個優先級值

原创 第七章快速排序之“快速排序的隨機化版本RANDOM-QUICKSORT”

因爲快速排序的最壞情況是O(n^2),最佳情況是O(nlgn),採用隨機化版本時間複雜度可以達到平均情況O(nlgn)。 書上的證明過程讓人心靜、讓人謙卑,its amazing!比起那些讓人拍案叫絕的證明過程,用代碼實現反而不是最重要的

原创 第七章快速排序之“快速插入排序”(練習7.4-5)

O(∩_∩)O~,這個名字乍聽起來比較黃。其實就是先快速排序進行劃分,等劃分小到一定規模比如k時,進行插入排序,因爲規模小到一定程度,插入排序的效率更高。我在前面還寫過一個合併插入排序的算法,思想跟這個相似。 總的時間複雜度爲O(nk+n

原创 第六章堆排序之“插入法建堆”(思考題6-1)

建堆既可以用堆調整方法將原數組調整爲一個堆,也可以藉助往堆中插入元素的方法從無到有的建立一個堆。 兩種方法比較: (1)藉助堆調整建堆的時間複雜度爲O(n)。藉助插入法建堆的時間複雜度爲O(nlgn) ,書上第二問要求證明這個複雜度,但是

原创 第七章快速排序之“採取“尾遞歸”和“三數取中”技術的快速排序”(思考題7-4、7-5)

QUICKSORT算法包含兩個對其自身的遞歸調用,即調用PARTITION後,左邊的子數組和右邊的子數組分別被遞歸排序。QUICKSORT中的第二次遞歸調用並不是必須的,可以用迭代控制結構來代替它,這種技術叫做“尾遞歸”,大多數的編譯器