Java 如何找到数组中的反转数?

Java 如何找到数组中的反转数?,java,arrays,sorting,compare,inversion,Java,Arrays,Sorting,Compare,Inversion,基本上,我试图用Java编写一个算法来确定数组中无序的对的数量。所以如果我们取i和j,并且j在数组中的位置比i高,但是a[i]>a[j],那么它将这两个数作为一个倒数。目前我拥有的是: for(int i = 0; i<n-1; i++){ if (A[i] > A[i+1]){ k++; for(int i=0;i A[i+1]){ k++; 这只是比较相邻的对,所以现在我尝试修改它,以找到数组中的任意两个数字,其中较低位置的值高于较高位置的值。我知道如

基本上,我试图用Java编写一个算法来确定数组中无序的对的数量。所以如果我们取i和j,并且j在数组中的位置比i高,但是a[i]>a[j],那么它将这两个数作为一个倒数。目前我拥有的是:

for(int i = 0; i<n-1; i++){
    if (A[i] > A[i+1]){
        k++;
for(int i=0;i A[i+1]){
k++;
这只是比较相邻的对,所以现在我尝试修改它,以找到数组中的任意两个数字,其中较低位置的值高于较高位置的值。我知道如何做类似的事情,但我希望运行时间为(n+k)其中n是数组的长度,k是数组中的反转数

编辑:以下是我实现插入排序的尝试:

int k = 0;
int [] A = {5, 4, 3, 2, 1};
int n = A.length;
for(int i = 1; i < n; i++){
    int temp = A[i];
    int j;
    for (j = i - 1; j >=0 && temp < A[j]; j--){
        A[j + 1] = A[j];
    A[j + 1] = A[j];
        k++;
intk=0;
int[]A={5,4,3,2,1};
int n=A.长度;
对于(int i=1;i=0&&temp

k应该是跟踪有多少个反转。对于数组5、4、3、2、1,返回的数字是6。对吗?

数组的反转计数表示–多远(或接近)数组未排序。如果数组已排序,则反转计数为0。如果数组按相反顺序排序,则反转计数为最大值。 从形式上讲,如果a[i]>a[j]和i 对于每个元素,计算位于其右侧且小于该元素的元素数

int getInvCount(int arr[], int n)
{
  int inv_count = 0;
  int i, j;

  for(i = 0; i < n - 1; i++)
    for(j = i+1; j < n; j++)
      if(arr[i] > arr[j])
        inv_count++;

  return inv_count;
}

/* Driver progra to test above functions */
int main(int argv, char** args)
{
  int arr[] = {1, 20, 6, 4, 5};
  printf(" Number of inversions are %d \n", getInvCount(arr, 5));
  getchar();
  return 0;
}
int-getInvCount(int-arr[],int-n)
{
int inv_count=0;
int i,j;
对于(i=0;iarr[j])
存货盘点++;
返回存货盘点;
}
/*用于测试上述功能的驱动程序*/
int main(int argv,char**args)
{
int arr[]={1,20,6,4,5};
printf(“反转数为%d\n”,getInvCount(arr,5));
getchar();
返回0;
}

解决方案是实现插入排序,并计算一对相邻元素被交换的次数。这是因为插入排序只对每个反转执行交换。事实上,它的运行时间是O(n+k),正如您所要求的那样


关于问题第二部分-以下是正确的插入排序算法:

for (int i = 1; i < n; i++) {
    int temp = A[i];
    int j;
    for (j = i - 1; j >= 0 && temp < A[j]; j--) {
        A[j + 1] = A[j];
        k++;  // Number of inversions
    }
    A[j + 1] = temp;
}
for(int i=1;i=0&&temp


额外注意:计算数组反转的有效方法是修改合并排序算法,该算法在O(n logn)时间内运行。但是当k很小时,O(n+k)大约为O(n),小于O(n logn)。实际上,合并排序的最佳情况时间仍然是O(n logn),而插入排序的最佳情况是O(n)因此,对于O(n+k)算法,合并排序不能回答OP的问题。

但是,这不是OP请求的O(n+k)运行时间,而是O(n^2)。但是,我看不到任何其他方法来实现这一点。OP可能只是运气不好。那么,反转是否仅适用于相邻的对,还是适用于任何对?我的答案是正确的还是我误解了问题?@JoshSusa:插入排序计算每对的反转。推理有点复杂,因为插入排序修改了数组拉坎:你的算法产生了正确的计数,但markspace指出它在O(n^2)时间内运行得太慢了。它有用吗?