QuickSort 不工作,认为交换是问题,免责声明我必须使用提供给我的快速排序方法
QuickSort not working, think swap is the issue, Disclaimer I must use the quicksort method provided to me
try {
for (i = 0; i < data.length; i++) {
working[i] = data[i];
}
FileWriter fw3 = new FileWriter("quicksort.dat");
long startTime3 = System.nanoTime();
quickSort(working,0, working.length - 1);
long endTime3 = System.nanoTime();
long totalTime3 = endTime3 - startTime3;
System.out.println("The time to complete the quick sort was :" + totalTime3 + " nano seconds");
for (i = 0; i < working.length; i++) {
fw3.write(Integer.toString(working[i]) + "\n");
}
System.out.println("The file has been sorted by quick sort and output to quicksort.dat \n");
fw3.close();
} catch (IOException e) {
System.out.println(e);
}
static void quickSort(int data[], int left, int right) {
int i, j;
int partition;
if (right > left) {
partition = data[right];
i = left - 1;
j = right;
for (;;) {
while (data[++i] < partition);
while (data[--j] > partition);
if (i >= j) {
break;
}
swap(data[i], data[j]);
swap(data[i], data[right]);
quickSort(data, left, i - 1);
quickSort(data, i + 1, right);
}
}
}
static void swap(int left, int right) {
int array[] = new int[19];
int temp = array[left];
array[left] = array[right];
array[right]=temp;
这只是代码片段,整个程序是其他类型的。每次使用快速排序函数时,我都会收到一个越界错误。我使用 19 作为我的数组,因为那是文件的大小我已经尝试了 20 来查看它是否修复它但没有运气。
编辑:我在下面提供了更新的代码以反映所做的更改我仍然遇到越界错误。
static void quickSort(int data[], int left, int right) {
int i, j;
int partition;
if (right > left) {
partition = data[right];
i = left - 1;
j = right;
for (;;) {
while (data[++i] < partition);
while (data[--j] > partition);
if (i >= j) {
break;
}
swap(data, i, j);
swap(data, i, right);
quickSort(data, left, i - 1);
quickSort(data, i + 1, right);
}
}
}
static void swap(int array[], int left, int right) {
int temp = array[left];
array[left] = array[right];
array[right] = temp;
}
您已将交换声明为:
void swap(int left, int right)
所以参数是数组的索引。
但是,你用 :
调用它
swap(data[i], data[j]);
因此您正在传递数组中的 VALUES。
尝试将调用更改为:
swap(i, j);
编辑添加:
必须指出的是,上述问题只是所提出的排序算法的一个问题。另一个问题是 swap
算法实际上并没有交换任何东西。它创建一个局部数组变量 array
,对其进行操作,然后 returns(因此丢弃该局部变量)。
如果您的任务是输出一个排序的数字列表,并且必须使用提供的排序代码对数字进行排序 - 那么该任务是不可能的,因为提供的排序代码作为排序算法存在无可救药的缺陷;它不会排序(正如您自己发现的那样),并且与快速排序的正确实现相比存在明显的严重问题(例如,您可以与此处的答案进行比较:)
编辑以添加以下修改后的代码:
修改后的排序代码仍然无可救药地被破坏了。它不是 QuickSort 的正确实现,仍然无法正确排序。
例如,我试过 运行 最后一个元素是最大的 :
int data[] = {23, 8, 19, 35, 2, 12, 7, 64 };
结果:没有排序 - 该方法直接用 i==7 和 j==6 命中了 if (i >= j) {break;}
,所以什么也没做。
相比之下,我上面链接的答案中的方法排序正确,因此您可以将给出的方法与该方法或其他已建立的文章进行比较(例如,在互联网上搜索 java quicksort
, 周围有很多)
正如 'racraman' 已经指出的那样,排序肯定需要修复。
尝试 re-implementing 具有以下方法签名的排序函数。
void sort(int[] arr, int leftIndex, int rightIndex) {
// swap code goes here
}
try {
for (i = 0; i < data.length; i++) {
working[i] = data[i];
}
FileWriter fw3 = new FileWriter("quicksort.dat");
long startTime3 = System.nanoTime();
quickSort(working,0, working.length - 1);
long endTime3 = System.nanoTime();
long totalTime3 = endTime3 - startTime3;
System.out.println("The time to complete the quick sort was :" + totalTime3 + " nano seconds");
for (i = 0; i < working.length; i++) {
fw3.write(Integer.toString(working[i]) + "\n");
}
System.out.println("The file has been sorted by quick sort and output to quicksort.dat \n");
fw3.close();
} catch (IOException e) {
System.out.println(e);
}
static void quickSort(int data[], int left, int right) {
int i, j;
int partition;
if (right > left) {
partition = data[right];
i = left - 1;
j = right;
for (;;) {
while (data[++i] < partition);
while (data[--j] > partition);
if (i >= j) {
break;
}
swap(data[i], data[j]);
swap(data[i], data[right]);
quickSort(data, left, i - 1);
quickSort(data, i + 1, right);
}
}
}
static void swap(int left, int right) {
int array[] = new int[19];
int temp = array[left];
array[left] = array[right];
array[right]=temp;
这只是代码片段,整个程序是其他类型的。每次使用快速排序函数时,我都会收到一个越界错误。我使用 19 作为我的数组,因为那是文件的大小我已经尝试了 20 来查看它是否修复它但没有运气。
编辑:我在下面提供了更新的代码以反映所做的更改我仍然遇到越界错误。
static void quickSort(int data[], int left, int right) {
int i, j;
int partition;
if (right > left) {
partition = data[right];
i = left - 1;
j = right;
for (;;) {
while (data[++i] < partition);
while (data[--j] > partition);
if (i >= j) {
break;
}
swap(data, i, j);
swap(data, i, right);
quickSort(data, left, i - 1);
quickSort(data, i + 1, right);
}
}
}
static void swap(int array[], int left, int right) {
int temp = array[left];
array[left] = array[right];
array[right] = temp;
}
您已将交换声明为:
void swap(int left, int right)
所以参数是数组的索引。
但是,你用 :
调用它swap(data[i], data[j]);
因此您正在传递数组中的 VALUES。
尝试将调用更改为:
swap(i, j);
编辑添加:
必须指出的是,上述问题只是所提出的排序算法的一个问题。另一个问题是 swap
算法实际上并没有交换任何东西。它创建一个局部数组变量 array
,对其进行操作,然后 returns(因此丢弃该局部变量)。
如果您的任务是输出一个排序的数字列表,并且必须使用提供的排序代码对数字进行排序 - 那么该任务是不可能的,因为提供的排序代码作为排序算法存在无可救药的缺陷;它不会排序(正如您自己发现的那样),并且与快速排序的正确实现相比存在明显的严重问题(例如,您可以与此处的答案进行比较:)
编辑以添加以下修改后的代码:
修改后的排序代码仍然无可救药地被破坏了。它不是 QuickSort 的正确实现,仍然无法正确排序。
例如,我试过 运行 最后一个元素是最大的 :
int data[] = {23, 8, 19, 35, 2, 12, 7, 64 };
结果:没有排序 - 该方法直接用 i==7 和 j==6 命中了 if (i >= j) {break;}
,所以什么也没做。
相比之下,我上面链接的答案中的方法排序正确,因此您可以将给出的方法与该方法或其他已建立的文章进行比较(例如,在互联网上搜索 java quicksort
, 周围有很多)
正如 'racraman' 已经指出的那样,排序肯定需要修复。
尝试 re-implementing 具有以下方法签名的排序函数。
void sort(int[] arr, int leftIndex, int rightIndex) {
// swap code goes here
}