gpt4 book ai didi

java - 用于计数数组反转的合并排序实现

转载 作者:行者123 更新时间:2023-12-01 15:19:28 24 4
gpt4 key购买 nike

下面是我对数组反转的实现。对于某些输入,它会产生所需的结果。例如:

1 : 0,1,2,3,4,5,6,7,8,9 -> 0 反转(正确)

2 : 1000,999,998,997,.......3,2,1 -> 499500 反转(正确)

3 : 1,3,5,2,4,6 -> 3 反转(正确)

但是对于

4:9,10,8,1,4,7,6,2,5,3 -> 41 反转(不正确)。正确答案是 33。

public class Assignment1 {
static int[] result = new int[10];

public static long divideW (int Arr[]) {
long countLeft ;
long countRight ;
long countMerge ;

int mid = (Arr.length)/2;

if (Arr.length <= 1)
return 0;
else
{
int leftArr[] = new int [mid];
int rightArr[] = new int [Arr.length - mid];

for (int i = 0; i < mid; i++){
leftArr[i] = Arr[i];
}
for (int j = 0; j < rightArr.length ; j++){
rightArr[j] = Arr[mid + j];
}
countLeft = divideW (leftArr);
countRight = divideW (rightArr);

//int[] result = new int[Arr.length];
countMerge = conquer(leftArr, rightArr, result);
return (countLeft + countRight + countMerge);
}
}
public static long conquer (int []l, int[]r, int[] result) {
int i = 0;
int j = 0;
int k = 0;
long count = 0;
while ((i < l.length) && (j < r.length)) {
if (l[i] <= r [j]) {
result[k] = l[i++];
}
else if (l[i] > r[j]) {
result[k] = r[j++];
count += l.length - i;
}
++k;
}
while ( i < l.length) {
result[k++] = l[i++];
}
while ( j < r.length) {
result[k++] = r[j++];
}
return count;
}


public static void main(String[] args) {
Assignment1 rs = new Assignment1();
int anArr[] = {9,10,8,1,4,7,6,2,5,3};

System.out.println (rs.divideW(anArr));

for (int i = 0 ; i < result.length; ++i) {
System.out.println (result[i]);
}
}
}

最佳答案

您的解决方案不正确,因为它没有将排序后的数组传递到征服功能

下面是我使用 C# 实现的代码。

using System;

namespace SortingAlgos
{
public class InversionCountUsingMergeSort
{
public static long InversionCount { get; set; }
public static void Main(string[] args)
{
//Load an array
int[] arrayInts = { 9, 10, 8, 1, 4, 7, 6, 2, 5, 3 };// { 10, 4, 7, 8, 6, 2, 3, 5 };//{1,3,5,2,4,6}--->3;//{ 9, 10, 8, 1, 4, 7, 6, 2, 5, 3 }-->41;//{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }--->0;//{ 10, 4, 7, 8, 6, 2, 3, 5 }; //LoadInts();

Console.WriteLine("========= UnSorted Array Items ==========");

//Print an unsorted array
PrintInts(arrayInts);

Console.WriteLine("========== Inversion Count =========");
//Sort the array
arrayInts = MergeSort(arrayInts);

//Print Sorted array
PrintInts(arrayInts);
Console.WriteLine(InversionCount);
Console.ReadKey();
}

private static int[] MergeSort(int[] arrayInts)
{
if (arrayInts.Length <= 1)
{
return arrayInts;
}
else
{
int[] result = new int[arrayInts.Length];

int midPoint = arrayInts.Length / 2;
int[] leftArray = new int[midPoint];
int[] rightArray;
if (arrayInts.Length % 2 == 0)
{
rightArray = new int[midPoint];
}
else
{
rightArray = new int[midPoint + 1];
}

for (int indexLeft = 0; indexLeft < midPoint; indexLeft++)
{
leftArray[indexLeft] = arrayInts[indexLeft];
}
int indexRight = 0;
for (int indexOnArryInts = midPoint; indexOnArryInts < arrayInts.Length; indexOnArryInts++)
{
if (indexRight < rightArray.Length)
{
rightArray[indexRight] = arrayInts[indexOnArryInts];
indexRight++;
}
}

leftArray = MergeSort(leftArray);
rightArray = MergeSort(rightArray);
return MergeArrays(leftArray, rightArray);

}
}

private static int[] MergeArrays(int[] leftArray, int[] rightArray)
{
int arraySize = leftArray.Length + rightArray.Length;
int[] arrayFinal = new int[arraySize];
int leftIndex = 0, rightIndex = 0;
for (int index = 0; index < arraySize; index++)
{
if (leftIndex < leftArray.Length && rightIndex < rightArray.Length)
{
if (leftArray[leftIndex] <= rightArray[rightIndex])
{
arrayFinal[index] = leftArray[leftIndex];
leftIndex++;
}
else if (leftArray[leftIndex] > rightArray[rightIndex])
{
arrayFinal[index] = rightArray[rightIndex];
rightIndex++;
InversionCount += leftArray.Length - leftIndex;
}
}
else if (leftIndex < leftArray.Length)
{
arrayFinal[index] = leftArray[leftIndex];
leftIndex++;
}
else if (rightIndex < rightArray.Length)
{
arrayFinal[index] = rightArray[rightIndex];
rightIndex++;
}
}
return arrayFinal;
}

private static void PrintInts(int[] arrayInts)
{
for (int index = 0; index < arrayInts.Length; index++)
{
Console.WriteLine(string.Format("{0}", arrayInts[index]));
}
}
}
}

关于java - 用于计数数组反转的合并排序实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11165546/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com