====== 5.3 Counting Inversions ====== \\ Counting inversions is a problem that we face when analyzing rankings in several applications. The main challenge in this category of problems is to find a way to efficiently compare the rankings.\\ Let's suppose we have a sequence of n numbers a1,a2,a3,...,an, assuming that all the numbers are different. Our concern is to find a measure that tells us how far this sequence is from being in ascending order. The value of that measure should be 0 if the list is sorted and should increase as the list gets more scrambled. Two indices ii > ajj, this means that ai appears after aj even though i>>>>>>>>>>>>>>>>>>>>>>> Merge-and-Count(A,B): >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Maintain a //current// pointer into each list, initialized to point to the front elements\\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Maintain a variable //count// for the number of inversions,initialized to 0\\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> While both lists are not empty:\\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Let ai and bj be the elements pointed to by the //current// pointer.\\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Append the smaller of the 2 elements above to the output list\\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> If bj is the smaller element:\\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Increment //Count// by the number of elements remaining in A.\\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> End if\\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Advance the //current// pointer in the list from which the smaller element was selected.\\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> End While\\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Once one list is empty, append the remainder of the list to the output\\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> Return //Count// and the merged list.\\ \\ The total running time of this algorithm is O(n) time.For solving the problem,we simultaneously sort and count as follows:\\ \\ >>>>>>>>>>>>>>>>>>Sort-and-Count(L)\\ >>>>>>>>>>>>>>>>>>>>>>>> if list L has one element\\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>return 0 and the list L\\ >>>>>>>>>>>>>>>>>>>>>>>> Divide the list into two halves A and B\\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> (iA, A) = Sort-and-Count(A)\\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> (iB, B) = Sort-and-Count(B)\\ >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> (i, L) = Merge-and-Count(A, B)\\ >>>>>>>>>>>>>>>>>>>>>>>>> return i = iA + iB + i and the sorted list L\\ \\ For a list with n elements, the overall running time is O(nlogn). \\ I give this section 8/10