[Link to this article]
Http://www.cnblogs.com/hellogiser/p/inversion-pairs-by-merge-sort.html
[Question]
With the beauty of programming, the issue of cutting light and shade can be further transformed into reverse order.
[Analysis]
Solving the reverse order problem is similar to MergeSort. You only need to make a slight modification to MergeSort. MergeSort adopts the division and control method. If you need to sort A [p... r], then it can be divided into A [p... q] And A [q... r], and then the two parts of the ordered Merge, and the Merge process is the time complexity of round (n. Based on the primary fixed rate T (n) = 2 (Tn/2) + hour (n), the time complexity is T (n) = hour (nlgn ).
Similarly, the idea of division and control can also be used to find the reverse order of the entire sequence, that is
Reverse Order (A [p... r]) = Reverse Order (A [p... q]) + reverse order (A [q... r]) + reverse order (A [p... q], A [q... r).
In combination with MergeSort, the key is how to effectively find the reverse order between A [p... q] And A [q... r] at the given (n) time. Because in the Merge process of merging and sorting, A [p... q] And A [q... r] has been ordered. Assume that Merge has been directed to A [I... q] And A [j... r]. Consider the next step: If A [I] <= A [j], it means that A [I] is better than the subsequent sequence A [j... the elements in r] are small and there is no reverse order. If A [I]> A [j], it means that A [j] is better than the previous sequence A [I... q] All are small, that is, the number of Reverse Order pairs ending with j is the number of remaining Series A [I... q] Number of elements.
In the Merge process, A [p... r], A [r... q] The number of Reverse Order pairs between them. The time complexity is also limit (n), which is the sumTime Complexity: hour (nlgn)This method is much better than the simple method round (n * n.
[MergeSort]
C ++ Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
|
/* Version: 1.0 Author: hellogiser Blog: http://www.cnblogs.com/hellogiser Date: 2014/6/25 */ Void merge (int * A, int p, int q, int r) { // Li: p... q Rj: q + 1... r Int n1 = q-p + 1; Int n2 = r-(q + 1) + 1; Int * L = new int [n1 + 1]; Int * R = new int [n2 + 1]; // Copy L and R For (int I = 0; I <n1; I ++) L [I] = A [p + I]; For (int j = 0; j <n2; j ++) R [I] = A [q + 1 + j]; // Mark end L [n1] = INT_MAX; R [n2] = INT_MAX; Int I = 0; // left Int j = 0; // right Int k = 0; // whole For (k = p; k <= r; k ++) { If (L [I] <= R [j]) { A [k] = L [I]; I ++; } Else { // L [I]> R [j] A [k] = R [j]; J ++; } }
Delete [] L; Delete [] R; }
Void merge_sort (int * A, int p, int r) { If (p <r) { Int q = (p + r)/2; Merge_sort (A, p, q ); Merge_sort (A, q + 1, r ); Merge (A, p, q, r ); } }
Void MergeSort (int * A, int n) { Merge_sort (A, 0, n-1 ); } |
[InversionPair]
InversionPair only needs to add three lines of code records to the merge function. First initialize inversion_pairs to 0, when L [I]> R [j], update inversion_pairs = inversion_pairs + (n1-i), and finally return. Return the sum of left_pair, right_pair, and corss_pair in merge_sort.
C ++ Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 |
|
/* Version: 1.0 Author: hellogiser Blog: http://www.cnblogs.com/hellogiser Date: 2014/6/25 */ Int merge_pair (int * A, int p, int q, int r) { // Li: p... q Rj: q + 1... r Int n1 = q-p + 1; Int n2 = r-(q + 1) + 1; Int * L = new int [n1 + 1]; Int * R = new int [n2 + 1]; // Copy L and R For (int I = 0; I <n1; I ++) L [I] = A [p + I]; For (int j = 0; j <n2; j ++) R [I] = A [q + 1 + j]; // Mark end L [n1] = INT_MAX; R [n2] = INT_MAX; Int I = 0; // left Int j = 0; // right Int k = 0; // whole // ================================== Int inversion_pairs = 0; // ================================== For (k = p; k <= r; k ++) { If (L [I] <= R [j]) { A [k] = L [I]; I ++; } Else { // L [I]> R [j] A [k] = R [j]; J ++; // ================================== Inversion_pairs + = (n1-I ); // ================================== } }
Delete [] L; Delete [] R; // ================================== Return inversion_pairs; // ================================== }
Int inversion_pair (int * A, int p, int r) { If (p <r) { Int q = (p + r)/2; // ================================================ Int left_pair = inversion_pair (A, p, q ); Int right_pair = inversion_pair (A, q + 1, r ); Int cross_pair = merge_pair (A, p, q, r ); Return left_pair + right_pair + cross_pair; // ================================================ } Else Return 0; }
Int InversionPair (int * A, int n) { Return inversion_pair (A, 0, n-1 ); } |
[LINK]
Http://www.cnblogs.com/bovine/archive/2011/09/22/2185006.html
Http://blog.csdn.net/zhanglei8893/article/details/6230233
[Link to this article]
Http://www.cnblogs.com/hellogiser/p/inversion-pairs-by-merge-sort.html