算法第二章上机报告

1.实践题目名称:求逆序对数目

2.问题描述:

对于一个数组,通过进行相邻两个元素的交换,以达到排序的目的,问最少交换次数是多少,要求算法复杂度为O(nlogn)

3.算法描述:求最少交换次数,就是求最大的逆序对数目,可采用合并算法解决,先把数组分成左右两半,再把左半边和右半边排好序之后,将左右两边合并,合并前先定义一个变量num并初始化为零,记录合并过程重找到的逆序对数,如果如果左边的一个元素大于右边的某个元素,就说明左边这个元素连同它后面的这部分元素都大于右边的这个元素,所以就将左边这个元素到中间元素的个数加到num中,左半边数组和右半边数组处理同理,最后即可得到最大逆序数

4.设算法时间复杂度为T(N),算法首先将问题分解成两个规模相同的子问题,两个子问题的时间规模为T(N/2)即2T(N/2),而合并这两个子问题所需要的时间规模为O(N),程序如下所示

while(i <= mid && j <= right)
{
if(a[i] >a[j])
{
num+=(mid-i+1);
b[index++] = a[j++];
}
else
b[index++] = a[i++];
}
while(i <= mid) b[index++] = a[i++];
while(j <= right) b[index++] = a[j++];
copy(a, b, left, right);

所以,算法的递归方程为T(N) = 2T(N/2) + O(N);

因为 log(2,2) = 1;

所以方程解得 T(N) = O(nlogn);

因为储存数据时要用到大小为N的数组,并且合并时,在最差的情况下,需要用到大小为N的临时数组来储存合并后的新数组,所以空间复杂度为O(N)。

心得:

这次上机对我来说有些难度,因为平时很少写有关分治法的代码,对于这个题目,首先你要知道求最小交换次数就是求最大逆序数,就需要你的数学水平要过关,并且在这之后要知道采用合并排序,也需要进行一定的思考,这道题也并不是单纯的采用合并排序,需要你对算法进行改进你才能的得到最大逆序数,这就需要你了解算法是如何进行的,所以这次上机让我对分治法有了更深的了解

代码:

import java.util.Scanner;

public class MinOppositeTwain {

int mergeSort(int[] a, int left, int right)
{
if(left<right)
{
int mid = (left + right) /2;
return mergeSort(a, left, mid) + mergeSort(a, mid +1, right) + merge(a, left, mid, right);
}
return 0;
}
int merge(int[] a, int left, int mid, int right)
{
int[] b = new int [1005];
int index = 0;
int i = left, j = mid +1;
int num = 0;
while(i <= mid && j <= right)
{
if(a[i] >a[j])
{
num+=(mid-i+1);
b[index++] = a[j++];
}
else
b[index++] = a[i++];
}
while(i <= mid) b[index++] = a[i++];
while(j <= right) b[index++] = a[j++];
copy(a, b, left, right);
return num;
}
static void copy(int[] a, int[] b, int left, int right)
{
for(int i = left, j = 0; i<=right; i++, j++)
a[i] = b[j];
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int[] a = new int[1005];
for(int i = 0;i<n; i++)
a[i] = input.nextInt();
input.close();
MinOppositeTwain twain = new MinOppositeTwain();
System.out.println(twain.mergeSort(a, 0, n-1));
}

}

posted @ 2020-10-03 18:40  zhang’  阅读(86)  评论(0编辑  收藏  举报