📜  使用STL根据因素数量进行排序

📅  最后修改于: 2021-04-24 14:34:53             🧑  作者: Mango

给定正整数数组。以每个元素的因子数量从大到小的顺序对给定数组进行排序,即,因子数量最多的元素应该是第一个显示,因子数量最少的元素应该是最后一个显示。具有相同数量因子的两个元素应与原始数组中的顺序相同。

例子:

Input : {5, 11, 10, 20, 9, 16, 23}
Output : 20 16 10 9 5 11 23
Number of distinct factors:
For 20 = 6, 16 = 5, 10 = 4, 9 = 3
and for 5, 11, 23 = 2 (same number of factors
therefore sorted in increasing order of index)

Input : {104, 210, 315, 166, 441, 180}
Output : 180 210 315 441 104 166

我们已经讨论了一种基于结构的解决方案,可以根据多种因素进行排序。

以下步骤按因子计数的降序对数字进行排序。

  1. 计算每个元素的不同数量的因素。请参考此。
  2. 创建一个成对的向量,用于存储元素及其因子计数。
  3. 使用任何排序算法,根据问题陈述对该数组进行排序。
// Sort an array of numbers according
// to number of factors.
#include 
using namespace std;
  
// Function that helps to sort elements 
// in descending order
bool compare(const pair &a,
             const pair &b) {
  return (a.first > b.first);
}
  
// Prints array elements sorted in descending
// order of number of factors.
void printSorted(int arr[], int n) {
  
  vector> v;
  
  for (int i = 0; i < n; i++) {
  
    // Count factors of arr[i].
    int count = 0;
    for (int j = 1; j * j <= arr[i]; j++) {
  
      // To check Given Number is Exactly
      // divisible
      if (arr[i] % j == 0) {
        count++;
  
        // To check Given number is perfect
        // square
        if (arr[i] / j != j)
          count++;
      }
    }
  
    // Insert factor count and array element
    v.push_back(make_pair(count, arr[i]));
  }
  
  // Sort the vector
  sort(v.begin(), v.end(), compare);
  
  // Print the vector
  for (int i = 0; i < v.size(); i++) 
    cout << v[i].second << " ";
}
  
// Driver's Function
int main() {
  int arr[] = {5, 11, 10, 20, 9, 16, 23};
  int n = sizeof(arr) / sizeof(arr[0]);
  
  printSorted(arr, n);
  
  return 0;
}
输出:
20 16 10 9 5 11 23

时间复杂度:O(n * sqrt(n))
辅助复杂度:O(n)