系統程式設計師成長計畫 動態陣列(四)

2021-04-26 01:19:08 字數 985 閱讀 2251

有序陣列的兩個應用

前面我們學習了陣列的排序方法,通常我們對陣列排序不是為了排序而排序,而是為了其它的用途才排序的,這裡了解一下有序陣列的兩個常見應用。

二分查詢

二分查詢也稱為折半查詢,它的前提是陣列中的元素是有序的。演算法過程如下(假定陣列為公升序):先拿要查詢的元素與陣列中間位置的元素相比較,如果小 於則在陣列的前半部分查詢,大於則在陣列的後半部分查詢,相等則在找到了。重複這個過程直到找到或者陣列被分成單個元素為止。實現如下:

int qsearch(void** array, size_t nr, void* data, datacomparefunc cmp)

else if(result < 0)

else

}return -1;

}

在編寫二分查詢的**時,除了演算法本身外還要注意兩個問題:

o 計算中間位置的方法。這裡使用mid = low + ((high - low) >> 1)代替(low+hign)/2,目的是為了避免整數溢位和除法計算。

o 邊界值問題。在編寫排序和查詢的程式時,最容易犯邊界值錯誤,寫程式時一定要保持思路清晰。不防模擬計算機去執行你寫的程式,用不同的輸入觀察所得的結果,最後加上自動測試,可以大大減少出錯的概率。

去除重複元素

在工作中,我經常使用linux中的命令sort和uniq的組合。uniq的功能是去除重複的元素,它的前提也是要求資料是有序的。下面我們寫乙個程式,它列印陣列中不重複元素(整數):

ret  unique_print_int(void* ctx, void* data)

return ret_ok;

}darray_foreach(darray, unique_print_int, &data);

注意:記得把data初始化成不等於第乙個元素的值,否則可能漏打第乙個元素。這個演算法當然同樣適用鍊錶,只要是有序的即可。

本節示例**請到這裡

系統程式設計師成長計畫 動態陣列(一)

雙向鍊錶和動態陣列是最簡單的兩種資料結構,在研讀大量源 之後,我發現正是這兩種最簡單的資料結構有著最廣泛的應用。像平衡二叉樹這樣的複雜資料結構,除了學習之外,你永遠都不會寫第二遍,甚至連使用的機會都沒有,而雙向鍊錶和動態陣列則會在開發中反覆的運用。也正是由於這個原因,我們才選擇雙向鍊錶和動態陣列作為...

系統程式設計師成長計畫 動態陣列(二)

對比雙向鍊錶和動態陣列 在c語言中,陣列的長度是事先確定的,不能在執行時動態調整。所謂動態陣列就是它的長度可以根據儲存資料多少自動調整,這需要我們用程式來實現。對比雙向鍊錶和動態陣列,我們會發現 o 動態陣列本身占用一塊連續的記憶體,而雙向鍊錶的每個結點要占用一塊記憶體。在頻繁增刪資料的情況下,雙向...

系統程式設計師成長計畫 動態陣列(三)(上)

作者 李先靜 排序大多數高階排序演算法都是針對陣列實現的,接下來我們一起學習一下幾種排序演算法,學習演算法本身只是我們的目標之一,最重要的是要從中學習一些思考問題的方法。對比不同演算法的特點,也有助於我們在設計時做出正確的選擇。這裡我們請讀者實現氣泡排序 快速排序和歸併排序。要求如下 o 演算法同時...