首页 > 代码库 > 第二章 算法基础 思考题2-4(逆序对)

第二章 算法基础 思考题2-4(逆序对)

  1 package chap02;
  2 
  3 import static org.junit.Assert.*;
  4 
  5 import java.util.Arrays;
  6 
  7 import org.junit.Test;
  8 
  9 public class ques2_4 {
 10     /**
 11      * 逆序对,将一个序列中的所有逆序对打印输出
 12      * 
 13      * @author xiaojintao
 14      * 
 15      */
 16     static void printReverseOrder(int[] n) {
 17         int i = 0;
 18         int j;
 19         while (i < n.length - 1) {
 20             for (j = i + 1; j < n.length; j++) {
 21                 if (n[i] > n[j]) {
 22                     System.out.println("<" + n[i] + "," + n[j] + ">");
 23                 }
 24             }
 25             i++;
 26         }
 27     }
 28 
 29     @Test
 30     public void testName() throws Exception {
 31         int[] a = { 2 };
 32         printReverseOrder(a);
 33     }
 34 
 35     /**
 36      * 修改归并排序,使之打印出序列中的所有逆序对数
 37      * 
 38      * @param n
 39      */
 40     static void printReverseByMergeSort(int[] n) {
 41         int start = 0;
 42         int end = n.length;
 43         mergeSort(n, start, end);
 44         ;
 45     }
 46 
 47     @Test
 48     public void test() throws Exception {
 49         int[] a = { 2, 3, 8, 6, 1, 5, 4, 0 };
 50         printReverseByMergeSort(a);
 51     }
 52 
 53     /**
 54      * 修改的归并排序算法用于逆序对输出
 55      * 
 56      * @param a
 57      * @return
 58      */
 59     protected static void mergeSort(int[] a, int start, int end) {
 60         if (start < end - 1) {
 61             int mid = (start + end) / 2;
 62             mergeSort(a, start, mid);
 63             mergeSort(a, mid, end);
 64             merge(a, start, mid, end);
 65         }
 66     }
 67 
 68     /**
 69      * 输出逆序对
 70      * 
 71      * @param a
 72      * @param b
 73      * @return
 74      */
 75     protected static void merge(int[] n, int start, int mid, int end) {
 76         int[] l = Arrays.copyOfRange(n, start, mid);
 77         int[] r = Arrays.copyOfRange(n, mid, end);
 78         int i = 0;
 79         int j = 0;// j<mid-start
 80         int k = 0;// k<end-mid
 81         while (i < end - start) {
 82             if (j < mid - start & k < end - mid) {
 83                 if (l[j] < r[k]) {
 84                     n[i + start] = l[j];
 85                     j++;
 86                 } else {
 87                     System.out.println("<" + l[j] + "," + r[k] + ">");
 88                     n[i + start] = r[k];
 89                     k++;
 90                 }
 91             } else if (k < end - mid) {
 92                 n[i + start] = r[k];
 93                 k++;
 94             } else if (j < mid - start) {
 95                 n[i + start] = l[j];
 96                 j++;
 97             }
 98             i++;
 99         }
100     }
101 }