1. 程式人生 > >排序方法和查詢方法

排序方法和查詢方法

排序

名詞解釋:

穩定:如果a原本在b前面,而a=b,排序之後a仍然在b的前面。

不穩定:如果a原本在b的前面,而a=b,排序之後 a 可能會出現在 b 的後面。

時間複雜度:對排序資料的總的操作次數。反映當n變化時,操作次數呈現什麼規律。

空間複雜度:是指演算法在計算機內執行時所需儲存空間的度量,它也是資料規模n的函式。 

應用場景

1 若n較小(如n≤50),可採用直接插入或直接選擇排序。  當記錄規模較小時,直接插入排序較好;否則因為直接選擇移動的記錄數少於直接插人,應選直接選擇排序為宜。 2 若檔案初始狀態基本有序(指正序),則應選用直接插人、冒泡或隨機的快速排序為宜; 3 若n較大,則應採用時間複雜度為O(nlgn)的排序方法:快速排序、堆排序或歸併排序。  1)快速排序是目前基於比較的內部排序中被認為是最好的方法,當待排序的關鍵字是隨機分佈時,快速排序的平均時間最短;  2)堆排序所需的輔助空間少於快速排序,並且不會出現快速排序可能出現的最壞情況。這兩種排序都是不穩定的。  3)若要求排序穩定,則可選用歸併排序。但前面介紹的從單個記錄起進行兩兩歸併的排序演算法並不值得提倡,通常可以將它和直接插入排序結合在一起使用。先利用直接插入排序求得較長的有序子序列,然後再兩兩歸併之。因為直接插入排序是穩定 的,所以改進後的歸併排序仍是穩定的。

查詢

順序查詢 二分查詢 二叉排序樹查詢 雜湊查詢 分塊查詢
條件 無序或有序 有序陣列 先建立二叉排序樹 建立雜湊表 將n個數據元素"按塊有序"劃分為m塊(m ≤ n)
原理 按順序查詢每個元素,直到關鍵字為止

while(min<max):

    mid = max+min/2

    if mid<key:

        min=mid+1

    elif mid>key:

        max = mid-1

    else:

        return mid

return Null

while(BT):

if BT.data>key:

        BT=BT->left

elif BT.data>key:

        BT=BT->right

else:

    return BT

return Null

根據鍵值方式(Key value)進行查詢,通過雜湊函式,定位資料元素。

以空間換時間的演算法

每一塊中的結點不必有序,但塊與塊之間必須"按塊有序";即第1塊中任一元素的關鍵字都必須小於第2塊中任一元素的關鍵字;

而第2塊中任一元素又都必須小於第3塊中的任一元素,……。

然後使用二分查詢及順序查詢。

時間複雜度 O(N) O(logN) O(logN) O(1)