C STL 排序原始碼詳解(一)

2021-08-04 23:34:53 字數 2289 閱讀 2163

(全部以int型別的vector為處理物件)

stl有關排序的幾個函式如下所示,需要更少資源(時間和空間)的演算法列在需要更多的前面,需要指出的是他們完成的工作是不一樣的。

1. partition                  4. partial_sort

2. stable_partition      5. sort

3. nth_element           6. stable_sort

個人筆記:

在快速排序中,切分函式是基本操作,那麼在往後和往前移動的過程中存在邊界判斷的需要,由於排序中的這種邊界判斷,處在底層,如果能夠取消,將極大提公升效率,對此要有一定認識。特別注意,low

一、partition

主要功能是將資料分成兩部分,一部分滿足條件,另一部分不滿足條件。滿足與否,是通過乙個返回bool量的單引數函式實現的。

#include#includeusing namespace std;

void swap(int &a,int &b)

bool fun(int a) //判別函式

int partition(vector&vec,bool (*pred)(int)) //通過函式指標傳入

if (low >= hi) break;

swap(vec[low],vec[hi]);

} return low;

}void myprint(const vectora)

cout << endl;

}int main()

; myprint(data);

partition(data,fun);

myprint(data);

system("pause");

return 0;

}

二、nth_element

void nth_element(vector&vec, int num)   將最小(或最大)的num個數放在陣列的開始處。注意num個數是無序的。

主要是利用快速排序的切分操作,原始碼針對樞軸的選取了優化措施(取待處理區間首、中間、尾3個值中的中間值作為樞軸,防止切分操作退化),這裡為了簡化,沒有對樞軸的選取進行優化。

根據切分函式的返回值,判斷是否達到了找出了num個滿足要求的數,如果不滿足,判斷下一處理區間。

#include#includeusing namespace std;

void swap(int &a, int &b)

int partition(vector&vec,int low,int hi)

swap(vec[low],vec[j]);

return j;

}void nth_element(vector&vec, int num)

cout << endl;

}int main()

; myprint(data);

nth_element(data,2);

myprint(data);

system("pause");

return 0;

}

三、partial_sort

void partial_sort(vector&vec,int len)    將最小的前len個數放到陣列最前面,並保持有序

區域性排序的原理是,建立乙個len大小的堆,初始時堆中資料就是陣列的前len個資料,將剩餘的資料逐個與堆頂的資料比較,如果小於堆頂資料,則交換,並調整堆,最後對堆進行排序。此方案可以實現nth_element函式,差別僅在於有沒有最後一步排序。

#include#includeusing namespace std;

void swap(int &a, int &b)

void adjustheap(vector&vec,int len,int i)

}void buildheap(vector&vec,int len)

}void sortheap(vector&vec,int len)

}void partial_sort(vector&vec,int len)

sortheap(vec,len);

}void myprint(const vectora)

cout << endl;

}int main()

; myprint(data);

partial_sort(data, 4);

myprint(data);

system("pause");

return 0;

}

C STL原始碼分析 演算法(一)

侯捷 sl體系結構核心分析 演算法 目錄 accumulate for each replace,replace if,replace copy 原始碼 accumulate 的原始碼如下。template class init class ty,class fn nodiscard inline ...

udhcp原始碼詳解(一)

udhcp 原始碼詳解 一 之檔案組織結構 dhcp server author hui 632254504 qq.com from created 2010 10 2 udhcp 目錄下有十幾個原始檔,乙個原始檔相對應乙個模組,完成一系列相關的功能,例如在 static leases.c 主要針對...

C STL原始碼分析 set和multiset

侯捷 sl體系結構核心分析 set和multiset探索 stl中assosiated container 比如 set 和 multiset 底層都是由紅黑樹作為支撐實現,所以在了解他們之前,有必要先來了解一下紅黑樹。template class traits class tree public ...