算法导论---逆序对 p24题,2-4

来源:互联网 发布:sql重复的行无法删除 编辑:程序博客网 时间:2024/04/27 12:56

修改合并排序 基本思路见p17

分解 -解决- 合并

/**
 * 分治法的设计思想:将一个规模为n的问题分解为k个规模比较小的子问题,这些子问题互相独立且与原问题相同。
 * 三个步骤:
 *    分解:将原问题分解成一系列的子问题;
 *    解决:递归地解各个子问题,若子问题足够小,则直接求解;
 *    合并:将子问题的结果合并成原问题的解;
 *
 *
 */

package leetcode;/** *  *  * @author Mouse * */public class Solution {static int count = 0;static void mergeSort(int a[], int p, int r) {if (p < r) {int q = (p + r) / 2;mergeSort(a, p, q);mergeSort(a, q + 1, r);merge(a, p, q, r);}}private static void merge(int[] a, int p, int q, int r) {int nums1 = q - p + 1;int nums2 = r - q;int left[] = new int[nums1 + 2];int right[] = new int[nums2 + 2];for (int i = 1; i <= nums1; i++) {left[i] = a[p + i - 1];}for (int j = 1; j <= nums2; j++) {right[j] = a[q + j];}left[nums1 + 1] = 65535;right[nums2 + 1] = 65535;int i = 1;int j = 1;int counter = 0;//计数器for (int k = p; k <= r; k++) {if (left[i] <= right[j]) {a[k] = left[i];i++;counter++;// 记录有多少个不符合要求} else if (left[i] > right[j]) {// 这个就是我们要的a[k] = right[j];j++;count += q - p + 1-counter;}}}public static void main(String[] args) {int a[] = { -1, 2, 3, 8, 6, 1 };// 默认从1处开始存元素mergeSort(a, 1, 5);for (int i = 1; i < a.length; i++) {System.out.print(a[i] + " ");}System.out.println();System.out.println("count:" + count);}}


2 0