问题描述
你好! 我被困在这个问题上,我必须在O(n)时间内对多位数的整数(总共n位数字)进行排序。我相信基数排序很可能是这里的方法,但是我不确定如何正确地做到这一点。首先,我尝试了选择排序,但是没有通过测试代码中的任何测试。
以下是所有测试用例的代码:
import java.io.*;
import java.util.*;
public class Lab4
{
/**
* Problem: Sort multi-digit integers (with n total digits) in O(n) time.
* (Technically,it is O(n * b) time. However,since our base b = 128 is constant,it is O(n).)
*/
private static void problem(byte[][] arr)
{
// Implement me!
for (int i=0; i<arr.length; i++){ //loop rows?
for(int j = 0; j < arr[i].length; j++){ //loop columns?
}
}
}
// ---------------------------------------------------------------------
// Do not change any of the code below!
private static final int LabNo = 4;
private static final String quarter = "Fall 2020";
private static final Random rng = new Random(654321);
private static boolean testProblem(byte[][] testCase)
{
byte[][] numberscopy = new byte[testCase.length][];
// Create copy.
for (int i = 0; i < testCase.length; i++)
{
numberscopy[i] = testCase[i].clone();
}
// Sort
problem(testCase);
Arrays.sort(numberscopy,new numberComparator());
// Compare if both equal
if (testCase.length != numberscopy.length)
{
return false;
}
for (int i = 0; i < testCase.length; i++)
{
if (testCase[i].length != numberscopy[i].length)
{
return false;
}
for (int j = 0; j < testCase[i].length; j++)
{
if (testCase[i][j] != numberscopy[i][j])
{
return false;
}
}
}
return true;
}
// Very bad way of sorting.
private static class numberComparator implements Comparator<byte[]>
{
@Override
public int compare(byte[] n1,byte[] n2)
{
// Ensure equal length
if (n1.length < n2.length)
{
byte[] tmp = new byte[n2.length];
for (int i = 0; i < n1.length; i++)
{
tmp[i] = n1[i];
}
n1 = tmp;
}
if (n1.length > n2.length)
{
byte[] tmp = new byte[n1.length];
for (int i = 0; i < n2.length; i++)
{
tmp[i] = n2[i];
}
n2 = tmp;
}
// Compare digit by digit.
for (int i = n1.length - 1; i >=0; i--)
{
if (n1[i] < n2[i]) return -1;
if (n1[i] > n2[i]) return 1;
}
return 0;
}
}
public static void main(String args[])
{
System.out.println("CS 302 -- " + quarter + " -- Lab " + LabNo);
testProblems();
}
private static void testProblems()
{
int noOfLines = 10000;
System.out.println("-- -- -- -- --");
System.out.println(noOfLines + " test cases.");
boolean passedAll = true;
for (int i = 1; i <= noOfLines; i++)
{
byte[][] testCase = createTestCase(i);
boolean passed = false;
boolean exce = false;
try
{
passed = testProblem(testCase);
}
catch (Exception ex)
{
passed = false;
exce = true;
}
if (!passed)
{
System.out.println("Test " + i + " Failed!" + (exce ? " (Exception)" : ""));
passedAll = false;
break;
}
}
if (passedAll)
{
System.out.println("All test passed.");
}
}
private static byte[][] createTestCase(int testNo)
{
int maxSize = Math.min(100,testNo) + 5;
int size = rng.nextInt(maxSize) + 5;
byte[][] numbers = new byte[size][];
for (int i = 0; i < size; i++)
{
int digits = rng.nextInt(maxSize) + 1;
numbers[i] = new byte[digits];
for (int j = 0; j < digits - 1; j++)
{
numbers[i][j] = (byte)rng.nextInt(128);
}
// Ensures that the most significant digit is not 0.
numbers[i][digits - 1] = (byte)(rng.nextInt(127) + 1);
}
return numbers;
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)