I am sorting an array by divisor sum in ascending order. If two or more numbers have the same sum of divisors they have to be sorted in ascending order. The problem I have is that my version is not fast enough. Here is my code:
int divisorSum( double number )
{
double sum = number + 1;
for( int i = 2; i <= number / 2; i++ )
if(( int )number % i == 0 )
sum += i;
return sum;
}
void sortByDivisorSum( double *array, int length )
{
for( int i = 0; i < length; i++ )
{
for( int j = i + 1; j < length; j++ )
{
if(( divisorSum( array[ i ]) > divisorSum( array[ j ])) || (( divisorSum( array[ i ] ) == divisorSum( array[ j ])) && ( array[ i ] > array[ j ])))
{
array[ i ] += array[ j ];
array[ j ] = array[ i ] - array[ j ];
array[ i ] -= array[ j ];
}
}
}
}
void readArrayy(double *array, int length)
{
for(int index = 0; index < length; index++)
scanf("%lf", &array[index]);
}
int main( void )
{
int length, in;
scanf( "%d", &length );
double ar[ length ];
readArrayy( ar, length );
sortByDivisorSum( ar, length );
for( in = 0; in < length; in++ )
{
printf( "%.0lf ", ar[in]);
}
return 0;
}
How to solve this in a faster way?
Input:
10
24 46 11 36 48 35 27 28 49 6
Output:
6 11 27 35 28 49 24 46 36 48
std::sort, which will be reasonably fast. \$\endgroup\$std::sortis in C++, and the question is tagged c ;-) \$\endgroup\$