1. 程式人生 > >Effective_STL 學習筆記(三十一) 瞭解你的排序選擇

Effective_STL 學習筆記(三十一) 瞭解你的排序選擇

 

排序出 20 個質量最高的 Widget,一種演算法叫作 partial_sort

1   bool qualityCompare( const Widget & lhs, const Widget & rhs )
2   {
3     // 返回 lhs 的質量是不是比 rhs 的質量好
4   }
5   . . .
6   partial_sort( widget.begin(), widget.begin() + 20, widget.end(), qualityCompare );
7       // 把最好的 20 個元素(按順序)放在 widget 的前端

 

選出任意 20 個質量最好的 widget(不排序),使用演算法 nth_element

1   nth_element( widgets.begin(), widgets.begin() + 19, widgets.end(), qualityCompare );
2                   // 把最好的 20 個元素放在 widget 前端,不排序

 

選出前兩個最好等級的元素,使用演算法 partition:

1   bool hasAcceptableQuality( const Widget & w )
2   {
3     // 返回 w 質量等級是否是 2 或更高 4   } 5   vector<Widget>::iterator goodEnd = 6     partiation( widgets.begin(), widgets.end(), hasAccetableQuality ); 7         // 把所有滿足hasAccetableQuality 的widgets移動到 widgets 前端

完成後,widgets.begin() 到goodEnd的區間容納了質量是 1 或 2 的 Widget穩定的演算法是 stable_partition

 

演算法 sort、stable_sort、partial_sort 和 nth_element 需要隨機訪問迭代器,

所以只能用於 vector、string、deque 和陣列,對於標準關聯容器無意義。

list::sort 提供了穩定排序,可以間接進行 list 元素 partial_sort 或 nth_element

 

partition 和 stable_partition 與 sort、stable_sort、partial_sort 和 nth_element 不同,

只需雙向迭代器,因此可以在任何標準序列迭代器上使用 partition 和 stable_parttion

 

總結排序選擇:

1. 需要在 vector、string、deque 或陣列上進行完全排序,可以使用 sort 或 stable_sort

2. 對於 vector、string、deque 或陣列,只需要排序前 n 個元素,使用 partial_sort

3. 對於 vector、string、deque 或陣列,只需選出前 n 個元素(不排序),使用 nth_element

4. 如果需要把標準序列容器的元素或陣列分隔為滿足和不滿足某個標準,則需要 partition 或 stable_partition

5. 如果資料是在 list 中,可以直接使用的是 partition 和 stable_partition,

 可以使用 list 的 sort 來代替演算法 sort 或 stable_sort,

 如果需要 partial_sort 或 nth_element 提供的效果,需要間接完成

 

另外,可以把資料放在標準關聯容器中來保持資料有序,可以考慮標準非 STL 容器 priority_queue,它也可以總是保持資料有序,priority_queue 不在 STL 是因為沒有迭代器

 

演算法排序(時間和空間):

  1. partition

  2. stable_partition

  3. nth_element

  4. partial_sort

  5. sort

  6. stable_sort