给定正整数数组。以每个元素的因子数量从大到小的顺序对给定数组进行排序,即,因子数量最多的元素应该是第一个显示,因子数量最少的元素应该是最后一个显示。具有相同数量因子的两个元素应与原始数组中的顺序相同。
例子:
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
我们已经讨论了一种基于结构的解决方案,可以根据多种因素进行排序。
以下步骤按因子计数的降序对数字进行排序。
- 计算每个元素的不同数量的因素。请参考此。
- 创建一个成对的向量,用于存储元素及其因子计数。
- 使用任何排序算法,根据问题陈述对该数组进行排序。
// 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)