(全部以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 ...