📜  C++ STL中的sort()vs.partial_sort()vs.nth_element()+ sort()

📅  最后修改于: 2021-05-04 07:56:40             🧑  作者: Mango

在本文中,我们将讨论sort(),partial_sort()和nth_element()+ sort()之间的区别。

下面是上述功能的说明:

  1. sort(): C++ STL提供一个函数sort() ,以O(N * log N)时间对元素列表进行排序。默认情况下,sort()以升序对数组进行排序。下面是说明sort()的程序:
    // C++ program to illustrate the default behaviour
    // of sort() in STL
    #include 
    using namespace std;
      
    // Driver Code
    int main()
    {
        // Given array of elements
        int arr[] = { 1, 5, 8, 9, 6, 7, 3, 4, 2, 0 };
        int n = sizeof(arr) / sizeof(arr[0]);
      
        // Function sort() to sort the element of
        // the array in increasing order
        sort(arr, arr + n);
      
        // Print the array elements after sorting
        cout << "\nArray after sorting using "
                "default sort is: \n";
        for (int i = 0; i < n; ++i) {
            cout << arr[i] << " ";
        }
      
        return 0;
    }
    
    输出:
    Array after sorting using default sort is : 
    0 1 2 3 4 5 6 7 8 9
    
  2. partial_sort(): std :: sort()的一种变体是std :: partial_sort() ,它不用于对整个范围进行排序,而仅用于对部分范围进行排序。它以[first,last)范围内的元素重新排列,以使得Middle之前的元素以升序排序,而Middle后面的元素则没有任何特定顺序。
    以下是说明partial_sort()的程序:
    // C++ program to demonstrate the use of
    // partial_sort()
    #include 
    using namespace std;
      
    // Driver Code
    int main()
    {
        // Given array of elements
        vector v = { 1, 3, 1, 10, 3, 3, 7, 7, 8 };
      
        // Using std::partial_sort() to sort
        // first 3 elements
        partial_sort(v.begin(), v.begin() + 3, v.end());
      
        // Displaying the vector after applying
        // partial_sort()
        for (int ip : v) {
            cout << ip << " ";
        }
      
        return 0;
    }
    
    输出:
    1 1 3 10 3 3 7 7 8
    

    partial_sort()的复杂度为O(N * log K) ,其中N是数组中元素的数量,K是中间和开始之间的元素数量。的partial_sort()是除分类更快()如果K大于N作为partial_sort()显著越小排序第一K中的元素,而排序()将所有排序N个元件。
    partial_sort()在最坏情况下的O(N * log K)运行时间并不能说明全部情况。它在随机输入下的平均运行时间为O(N + K * log K + K *(log K)*(log Nk))
    因为很少的工作做是为了忽略不迄今所看到的只是一个单一的比较中,最小ķ中的每个元素,常数因子被证明是难以被击败的小K,甚至一个渐近更好的算法。

  3. nth_element(): nth_element()是一种STL算法,它以如下方式重新排列列表,即,如果对列表进行排序,则位于第n个位置的元素就是应该位于该位置的元素。
    它不对列表进行排序,只是第n个元素之前的所有元素均不大于该列表,而后继该元素的所有元素均不小于该列表。
    下面是说明nth_element()的程序:
    // C++ program to demonstrate the use
    // of std::nth_element
    #include 
    using namespace std;
      
    // Driver Code
    int main()
    {
        // Given array v[]
        int v[] = { 3, 2, 10, 45, 33, 56, 23, 47 };
      
        // Using nth_element with n as 5
        nth_element(v, v + 4, v + 8);
      
        // Since, n is 5 so 5th element
        // should be sorted
        for (int i = 0; i < 8; i++)
            cout << v[i] << " ";
      
        return 0;
    }
    
    输出:
    3 2 10 23 33 56 45 47
    

以下是三种算法之间的基准比较,N在0到10 7之间变化(图中的X轴):

nth_element()+ sort()解决方案在渐近速度上最快,并且对于较大的K而言,其执行效果更好(多数情况下为对数标度)。但是在K <70000的情况下,对于随机输入,它的确会丢失partial_sort() ,最多可达6倍。