如果没有任何包的帮助,你将如何编写这个代码?(与mergeSort(int[] A)(接受一个数组的输入)和merge(int[] a,int[] l,int[] r)的布局相同)。主要问题是将Arrays.copyOfRange转换为非包版本的java代码。感谢您回答这个问题。
我的另一个问题是如何实现一个合并函数,这次在它的参数中有3个数组。
这是我试过的代码:
public static int[] mergeArrays3(int[] a, int[] b, int[] c) {
int[] result = new int[a.length + b.length +c.length];
int i = 0, j = 0, k = 0, l=0;
while(i<a.length &&j<b.length && l<c.length)
{
// if (b[i] < a[j] || b[i] <c[i]) {
// result[k] = c[i];
// j++;
// }
if (c[i] < b[j] || c[i] <a[i]) {
result[k] = c[i];
l++;
}
if (a[i] < b[j] || a[i] <c[i]) {
result[k] = a[i];
i++;
}
else {
result[k] = b[j];
j++;
}
k++;
}
while(i<a.length)
{
result[k] = a[i];
i++;
k++;
}
while(j<b.length)
{
result[k] = b[j];
j++;
k++;
}
while(l<c.length)
{
result[k]=c[l];
l++;
k++;
}
return result;
}
import java.io.*;
import java.util.Arrays;
public class MergeSort {
public static void main(String[] args) throws IOException{
BufferedReader R = new BufferedReader(new InputStreamReader(System.in));
int arraySize = Integer.parseInt(R.readLine());
int[] inputArray = new int[arraySize];
for (int i = 0; i < arraySize; i++) {
inputArray[i] = Integer.parseInt(R.readLine());
}
mergeSort(inputArray);
for (int j = 0; j < inputArray.length; j++) {
System.out.println(inputArray[j]);
}
}
static void mergeSort(int[] A) {
if (A.length > 1) {
int q = A.length/2;
//changed range of leftArray from 0-to-q to 0-to-(q-1),how would you edit Arrays.copyOfRange to manually make the same function without using any packages?
*int[] leftArray = Arrays.copyOfRange(A, 0, q-1);
//changed range of rightArray from q-to-A.length to q-to-(A.length-1)
int[] rightArray = Arrays.copyOfRange(A,q,A.length-1);*
mergeSort(leftArray);
mergeSort(rightArray);
merge(A,leftArray,rightArray);
}
}
static void merge(int[] a, int[] l, int[] r) {
int totElem = l.length + r.length;
//int[] a = new int[totElem];
int i,li,ri;
i = li = ri = 0;
while ( i < totElem) {
if ((li < l.length) && (ri<r.length)) {
if (l[li] < r[ri]) {
a[i] = l[li];
i++;
li++;
}
else {
a[i] = r[ri];
i++;
ri++;
}
}
else {
if (li >= l.length) {
while (ri < r.length) {
a[i] = r[ri];
i++;
ri++;
}
}
if (ri >= r.length) {
while (li < l.length) {
a[i] = l[li];
li++;
i++;
}
}
}
}
//return a;
}
}
2条答案
按热度按时间jgwigjjp1#
这个方法没有
Arrays.copyOfRange
那么快,并且它不能覆盖所有情况,例如负索引,还需要检查大小ha5z0ras2#
自上而下的合并排序,使用for循环进行一次数组复制,并交替使用参数来改变每一级递归的合并方向。MergeSort是入口函数,用于分配并复制到第二个数组。MergeSortR是递归函数。除非所有3个子数组都至少有一个元素,否则不会调用合并。嵌套的if| Merge中的else只需要两次比较来确定最小元素,但使用重复代码来处理a [a2]是最小元素的情况。(使用C|
bb
是开始索引,ee
是结束索引。