Given a matrix with m rows and n columns, each of which are sorted. How to efficiently sort the entire matrix?
I know a solution which runs in O(m n log(min(m,n)). I am looking for a better solution.
The approach that I know basically takes 2 rows/cols at a time and applies merge operation.
Here is an example:
[[1,4,7,10],
[2,5,8,11],
[3,6,9,12]]
is the input martix which has every row and column sorted.
Expected output is:
[1,2,3,4,5,6,7,8,9,10,11,12]
Another example:
[[1, 2, 3, 3, 4, 5, 6, 6, 7, 7],
[1, 2, 4, 6, 7, 7, 8, 8, 9,10],
[3, 3, 4, 8, 8, 9,10,11,11,12],
[3, 3, 5, 8, 8, 9,12,12,13,14]]
Approach: Create a temp[] array of size n^2. Starting with the first row one by one copy the elements of the given matrix into temp[]. Sort temp[]. Now one by one copy the elements of temp[] back to the given matrix.
You need to create a sort column and then use 'Modeling' / 'Sort by Column'. Make sure 'Alias Sort' is a whole number. Then highlight 'Alias' and go to Modeling / Sort by Column and choose Alias Sort. You matrix should sort in a descending manner.
I don't think you can do it any faster than Ω(m n log(min(m, n)), at least not in the general case.
Suppose (without loss of generality) that m < n. Then your matrix looks like this:
Each circle is a matrix entry and each arrow indicates a known order relation (the entry at the source of the arrow is smaller than the entry at the destination of the arrow).
To sort the matrix, we must resolve all the unknown order relations, some of which are shown in the grey boxes here:
Sorting all of these boxes takes:
2 Σk < m Ω(k log k) + (n - m + 1) Ω(m log m)
= 2 Ω(m² log m) + (n - m + 1) Ω(m log m)
= Ω(m n log m)
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With