我是Java的初学者,试图创建一个实现二进制插入排序的类,并对数据大小为50,500,500,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();
}
有人可以帮我修改我的代码吗?
答案 0 :(得分:1)
您的代码中存在错误。我纠正了他们。首先,您在此行中定义了left
和right
个变量: -
public double binaryInsertionSort(long array[], int value, int left, int right)
为什么你再次在方法体内定义它们。所以我删除了他们的双重声明。其次,您将left
变量的值分配给y
这是错误的。实际上你必须指定y to
左边的值。代码中的第三个错误是您的方法调用错误。您使用四个参数定义了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();
}
`
我邮寄了您完整的程序代码。检查你的邮箱。承认我是否认为我的答案有用。快乐编码:)
答案 1 :(得分:0)
您的二进制插入排序代码包含编译器必须告诉您的大量错误。您的第一笔业务应该是理解并解决所有这些问题。或者,二进制插入排序代码的许多问题似乎是通过尝试调整标准插入排序代码而产生的。我建议从头开始实现二进制版本。另外,首先实现排序;在排序本身工作之后添加检测(比较和交换计数)。
此外,您的代码中存在一些明显的奇怪之处:</ p>
以递归方式实现任何版本的插入排序是非典型的,也不是有利的。
你在递归实现上的特定尝试无论如何都没有意义:主循环只运行一次迭代,循环后的代码就会死了。
很难确定,但我认为您已经完全理解二进制插入错误。您似乎试图将数组拆分成碎片以递归排序,例如合并排序或快速排序,但这不是二进制插入排序的工作方式。二进制插入排序与标准插入排序的不同之处主要在于它使用二分搜索而不是线性搜索来查找每个元素的插入位置。