gpt4 book ai didi

java - 3向归并排序

转载 作者:行者123 更新时间:2023-11-30 09:36:49 26 4
gpt4 key购买 nike

我有一项任务是在 Java 中实现类似 3 向合并短路的东西。我将输入一个整数数组,我必须执行以下操作:

在具有 3 向除法的数组中实现合并排序,并打印数组的 3 个排序分区。例如,如果我将以下数组作为输入 [9 23 10 90 70 10 3 23] 输出将首先是排序的 3 个分区:[9 10 24] [70 90] [3 10 23] 然后最终数组排序 [3 9 10 10 23 24 70 90].

这是我到目前为止实现的:

public static void mergesort(int[] data) {
int elements = data.length - 1;
int length1;
int length2;
int length3;

if (elements % 3 == 0) {
length1 = elements / 3;
length2 = elements / 3;
length3 = elements / 3;
} else if (elements % 3 == 1) {
length1 = (elements / 3) + 1;
length2 = elements / 3;
length3 = elements / 3;
} else { //if (elements % 3 == 2)
length1 = (elements / 3) + 1;
length2 = elements / 3;
length3 = (elements / 3) + 1;
}

Arrays.sort(data, 0, length1 - 1);
Arrays.sort(data, length1, length1 + length2 - 1);
Arrays.sort(data, length1 + length2, length1 + length2 + length3 - 1);

merge(data, 0, length1, length1 + length2);
merge(data, 0, length1 + length2, length1 + length2 + length3);
}

private static void merge(int[] data, int first, int n1, int n2) {
int[] temp = new int[n1 + n2];
int copied = 0;
int copied1 = 0;
int copied2 = 0;
int i;

while ((copied1 < n1) && (copied2 < n2)) {
if (data[first + copied1] < data[first + n1 + copied2]) {
temp[copied++] = data[first + (copied1++)];
} else {
temp[copied++] = data[first + n1 + (copied2++)];
}
}

while (copied1 < n1) {
temp[copied++] = data[first + (copied1++)];
}
while (copied2 < n2) {
temp[copied++] = data[first + n1 + (copied2++)];
}

for (i = 0; i < n1 + n2; i++) {
data[first + i] = temp[i];
}
}

我所做的是首先根据情况将数组分成 3 个部分,然后我对数组的 3 个部分进行排序,然后我尝试合并前 2 个部分,然后将合并的部分与最后一个部分合并.

我已经为初学者实现了这两种方法,但首先我非常确信合并方法是糟糕和错误的,其次我认为我在这个问题上的方法有问题我觉得即使是合并排序方法是错误的并且实现得很糟糕。

我想要的是关于在这个问题上我应该做什么以及我的实现完全错误的建议

最佳答案

void merge(int arr1[], int arr2[])
{
int p1 = 0;
int p2 = 0;
int arr3[] = new int[arr1.length + arr2.length];

while(p1 < arr1.length && p2 < arr2.length)
{
if(arr1[p1] > arr2[p2])
{
arr3[p2] = arr2[p2];
p2++;
}
else
{
arr3[p1] = arr1[p1];
p1++;
}
}

//Now just add the code for just concatenating any remaining elements in
// either arr1 or arr2
//This will happen if the lengths of arr1 and arr2 differ


}

这是合并两个数组的基本代码(未测试,可能会遗漏边界条件)。尝试将其合并到您的代码中。

关于java - 3向归并排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10638549/

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