Rounded Percentages up to 100% using Insertion-Sort Algorithm

When you need to represent percentages as whole numbers using  Math.round() ,  you end up with a total of 101%. 



Value
Percentage
Rounded
A
650
49.88%
50
B
230
17.65%
18
C
150
11.51%
12
D
273
20.95%
21

1303
100.00%
101


As you can see above the total in the rounded column is 101. Let's solve this problem using a well known algorithm.

Step 1:

We begin to sum the given values for calculating the percentages. While iterating, we copy all the properties to a destination object (NVPPercentage) which will be pushed to an array (temp).


Step 2:

The insertion sort, is an efficient algorithm for sorting a small number of elements. We start for each element to calculate the percentage (P) and the rounded percentage (RP). We sum also the rounded percentages (e.g. 101). We also compare in an inner loop the current element (CE) with the left ones for sorting purpose.

While j is CE - 1, we define the criteria for the inner loop as :

j >= 0 && (RP[j] - P[j]) < (RP[CE] - P[CE])

So, we sort our sequence in descending order (temp) by calculating the difference between the RP and P.

We substract the sum of rounded percentages from 100 to get the remainder.



Step 3:

The last step simply add or substract the remainder from the sorting sequence elements.



Full Code:





Comments

Popular posts from this blog

Spring JPA : Using Specification with Projection

Chip input using Reactive Form