sort與nth_element使用

weixin_43537820發表於2021-01-03

sort與nth_element使用

  • sort

sort函式是C++中對於跟定區間的所有元素進行排序的函式,預設為升序排序,sort時間複雜度為O(nlog2n),因為sort函式底層使用的是快速排序演算法。包含在algorithm標頭檔案中

#include <algorithm>
//sort函式用法
sort(start, end, cmp);
//start指的是排序陣列的第一個位置、
//end指的是排序陣列最後一個位置的下一位
//cmp為可選項,可不填,也可以自己定義排序方法
函式名功能描述底層實現
sort對於給定區間元素進行描述(不穩定)快速排序
stable_sort對於給定區間元素進行穩定排序歸併排序
partial_sort對於給定區間元素進行部分排序交換元素儲存位置
partial_sort_copy對於給定區間元素複製並且排序拷貝後交換元素儲存位置
is_sorted判斷一個區間是否排好序未知?
partition使得符合某個條件的元素放在前面快速排序
stable_partition相對穩定的使得某個條件元素放在前面快速排序
nth_element找到給定區間對應元素的值快速選擇排序
  • nth_element

nth_element()方法主要是求給定區間第k小的元素,與普通的排序不同,它只是選取給定的第k個元素大小所在的固定的位置,底層實現是快速選擇排序。值得注意的是nth_element得到的元素序列是亂序的,但是第k個元素位置是正確的

//nth_element使用方法
nth_element(start, start + k, end);
//start表示陣列開始的位置
//start + k表示陣列升序情況下第k個位置應該對應的資料元素
//end表示陣列結束的位置

C++reference有對應nth_element的講解

// nth_element example
#include <iostream>     // std::cout
#include <algorithm>    // std::nth_element, std::random_shuffle
#include <vector>       // std::vector

bool myfunction (int i,int j) { return (i<j); }

int main () {
  std::vector<int> myvector;

  // set some values:
  for (int i=1; i<10; i++) myvector.push_back(i);   // 1 2 3 4 5 6 7 8 9

  std::random_shuffle (myvector.begin(), myvector.end());

  // using default comparison (operator <):
  std::nth_element (myvector.begin(), myvector.begin()+5, myvector.end());

  // using function as comp
  std::nth_element (myvector.begin(), myvector.begin()+5, myvector.end(),myfunction);

  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;
  std::cout << '\n';

  return 0;
}

possible output

myvector contains: 3 1 4 2 5 6 9 7 8

相關文章