【问题标题】:What is Wrong with my Binary Insertion Code?我的二进制插入代码有什么问题?
【发布时间】:2016-09-25 21:30:15
【问题描述】:

我是一名 Java 初学者,试图创建一个实现二进制插入排序并排序数据大小为 50、500、5000、50000 和 500000 的随机数组的类。

当我将它实现为插入排序时,该程序运行良好。

public double InsertionSort(long array[]) {
            setType("Insertion Sort");
            long temp;
            int y;
            double numOfSwap = 0, numOfComparisons = 0;
            double startTime = System.nanoTime();
            for (int x = 1; x < array.length; x++) {
                temp = array[x];
                numOfSwap++;
                y = x;
                numOfComparisons++;
                while ((y > 0)) {
                    numOfComparisons++;
                    if ((array[y - 1]) > temp) {
                        array[y] = array[y - 1];
                        numOfSwap++;
                        y = y - 1;
                    } else
                        break;
                }
                array[y] = temp;
                numOfSwap++;
            }
            double endTime = System.nanoTime();
            setSwap(numOfSwap / 3);
            setComparisons(numOfComparisons);
            setTime(endTime - startTime);
            return getTime();

        }

但是当我尝试插入二进制搜索时,它不再起作用了。

 public double binaryInsertionSort(long array[], int value, int left, int right) {
            setType("Binary Insertion Sort");
            long temp;
            int y;
            int left, right;
            double numOfSwap = 0, numOfComparisons = 0;
            double startTime = System.nanoTime();
            for (int x = 1; x < array.length; x++) {
                temp = array[x];
                numOfSwqp++;
                int left = y;
                int right = x;
                if (left>right)
                    return -1;
                int middle = (left + right)/2;
                if (array[middle] == value)
                    return middle;
                numOfComparisons++;
                else if (array[middle]>value)
                    return binaryInsertionSort(array, value,left, middle -1);
                numOfComparisons++;
                else
                    return binaryInsertionSort (array, value, middle +1, right);
                numOfComparisons++;
            }
            double endTime = System.nanoTime();
            setSwap(numOfSwap / 3);
            setComparisons(numOfComparisons);
            setTime(endTime - startTime);
            return getTime();
        }

有人可以帮我修复我的代码吗?

【问题讨论】:

  • 您听说过 MCVE 吗?它代表最小、完整和可验证的示例。我认为你应该在你的“最小”上工作。 stackoverflow.com/help/mcve
  • @JaroslawPawlak:至少他提供了完整的代码。
  • @GauravMahindra 这可能是件好事,但是说“我有这 400 行代码,我将其更改为其他 400 行代码并且它停止工作”无论如何都没有帮助。
  • 如果代码至少可以编译也会很有帮助。它有许多语法错误。所提供的代码不仅远非minimal,而且也不是verifiable
  • @JaroslawPawlak 先生,我正式道歉,我无意制作,也不知道 MCVE。我认为提供完整的代码对那些正在学习并在未来有类似问题的人有所帮助——有助于扩大这个学习社区。谢谢你让我知道我的错误。

标签: java sorting search binary insertion


【解决方案1】:

您的代码中有错误。我纠正了他们。首先,您的 leftright 变量在这一行中定义:-

public double binaryInsertionSort(long array[], int value, int left, int right)

你为什么要在方法体内再次定义它们。所以我删除了他们的双重声明。其次,您将left 变量的值分配给y,这是错误的。实际上,您必须分配 y toleft 的值。您的代码中的第三个错误是您的方法调用错误。您使用四个参数定义了 binaryInsertionSort 并且您通过单个参数调用它,所以我修改了您的方法调用,如下所示:-

sortTime = binaryInsertionSort(sortedArray,10,20,30);

其余的都是小错误。这是您的`binaryInsertionSort 方法的正确代码:-

public double binaryInsertionSort(long array[], int value, int left, int right) {

setType("Binary Insertion Sort");

long temp;

int y=0;

//int left, right;

double numOfSwap = 0, numOfComparisons = 0;

double startTime = System.nanoTime();

for (int x = 1; x < array.length; x++) {

temp = array[x];

numOfSwap++;

y=left;

right = x;

if (left>right){
return -1;
}

int middle = (left + right)/2;

if (array[middle] == value){

    numOfComparisons++;
    return middle;

} else if (array[middle]>value){

    numOfComparisons++;
    return binaryInsertionSort(array, value,left, middle -1);

} else{

    numOfComparisons++;    
    return binaryInsertionSort (array, value, middle +1, right);
    }

}

double endTime = System.nanoTime();

setSwap(numOfSwap / 3);

setComparisons(numOfComparisons);

setTime(endTime - startTime);

return getTime();

}
`

我已将您的程序的完整更正代码邮寄给您。检查你的邮箱。确认我是否觉得我的回答有用。快乐编码:)

【讨论】:

  • 对于迟到的回复,我深表歉意,但尽管时间很长,我仍然需要回复,感谢您的宝贵时间!
【解决方案2】:

您的二进制插入排序代码包含许多编译器必须告诉您的错误。您的首要任务应该是了解并解决所有这些问题。或者,二进制插入排序代码的许多问题似乎是通过尝试修改标准插入排序代码而产生的。我建议改为从头开始实现二进制版本。另外,先实现排序;在排序本身工作后添加检测(比较和交换计数)。

此外,您的代码中有一些明显的奇怪之处:

  • 递归地实现任何版本的插入排序都是不典型的,也没有好处。

  • 您对递归实现的具体尝试无论如何都没有意义:主循环将只运行一次迭代,循环之后的代码将失效。

  • 很难确定,但我认为您对二元插入排序的整个想法都误解了。您似乎正在尝试将数组拆分为多个部分以递归方式对它们进行排序,例如合并排序或快速排序,但这不是二进制插入排序的工作方式。二分插入排序与标准插入排序的主要区别在于它使用二分查找而不是线性查找来查找每个元素的插入位置。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-22
    • 2023-04-10
    • 1970-01-01
    • 2019-07-27
    • 1970-01-01
    • 2021-11-08
    • 1970-01-01
    相关资源
    最近更新 更多