使用快速排序对数组进行排序 (JAVA)
Sorting arrays with quickSort (JAVA)
好的,所以我需要使用快速排序对数组进行升序和降序排序。我的代码适用于升序,并且在 most 的时间适用于降序,但它随机不能很好地用于降序...最常见的是当最小的数字在原来的第一位置。所以我可能有一个数组 (261, 940, 604, 655) 这意味着它应该输出为 (940, 655, 604, 261) 但我得到的是 (655,940, 604, 261)。但是,我无法弄清楚 为什么 数组并不总是正确排序。有什么提示吗?
private void sortButtonActionPerformed(java.awt.event.ActionEvent evt) {
// just how the array is filled
for (int i =0; i<numNum; i++)
{
numList [4] = generator.nextInt(1000);
}
// call on quickSort "decending" method
QuickSort_HighLow(numList, 0, numList.length - 1);
for( int x=0; x <= numList.length-1; x++)
{
sortedOutput.setText((sortedOutput.getText())+ "\n" + numList[x] );
}
}
public static int PartitionHighLow(int[] numbers, int left, int right)
{
int pivot = numbers[left];
while (true)
{
while (numbers[left] > pivot)
left ++ ;
while (numbers[right] < pivot)
right --;
if (left < right)
{
int temp = numbers[left];
numbers[left] = numbers[right];
numbers[right] = temp;
}
else
{
return right;
}
}
}
public static void QuickSort_HighLow(int[] arr, int left, int right)
{
// For Recusrion
if(left < right)
{
int pivot = PartitionHighLow(arr, left, right);
if(pivot < 1)
QuickSort_HighLow(arr, left, pivot );
if(pivot + 1 < right)
QuickSort_HighLow(arr, pivot + 1, right);
}
}
实现的一个问题是,如果你有相同的数字,它就不会工作(如果它被选为枢轴,你将不断地相互切换)。
另一个在递归中:
if(pivot > left + 1)
QuickSort_HighLow(arr, left, pivot - 1);
if(pivot < right - 1)
QuickSort_HighLow(arr, pivot + 1, right);
您的分区函数将只执行一次,如果最小的在前,它将停止 for desc。您将其指定为枢轴,将其移到最后,计算 left==right, return length-1 并终止。这看起来像是快速排序的错误实现
好的,所以我需要使用快速排序对数组进行升序和降序排序。我的代码适用于升序,并且在 most 的时间适用于降序,但它随机不能很好地用于降序...最常见的是当最小的数字在原来的第一位置。所以我可能有一个数组 (261, 940, 604, 655) 这意味着它应该输出为 (940, 655, 604, 261) 但我得到的是 (655,940, 604, 261)。但是,我无法弄清楚 为什么 数组并不总是正确排序。有什么提示吗?
private void sortButtonActionPerformed(java.awt.event.ActionEvent evt) {
// just how the array is filled
for (int i =0; i<numNum; i++)
{
numList [4] = generator.nextInt(1000);
}
// call on quickSort "decending" method
QuickSort_HighLow(numList, 0, numList.length - 1);
for( int x=0; x <= numList.length-1; x++)
{
sortedOutput.setText((sortedOutput.getText())+ "\n" + numList[x] );
}
}
public static int PartitionHighLow(int[] numbers, int left, int right)
{
int pivot = numbers[left];
while (true)
{
while (numbers[left] > pivot)
left ++ ;
while (numbers[right] < pivot)
right --;
if (left < right)
{
int temp = numbers[left];
numbers[left] = numbers[right];
numbers[right] = temp;
}
else
{
return right;
}
}
}
public static void QuickSort_HighLow(int[] arr, int left, int right)
{
// For Recusrion
if(left < right)
{
int pivot = PartitionHighLow(arr, left, right);
if(pivot < 1)
QuickSort_HighLow(arr, left, pivot );
if(pivot + 1 < right)
QuickSort_HighLow(arr, pivot + 1, right);
}
}
实现的一个问题是,如果你有相同的数字,它就不会工作(如果它被选为枢轴,你将不断地相互切换)。
另一个在递归中:
if(pivot > left + 1)
QuickSort_HighLow(arr, left, pivot - 1);
if(pivot < right - 1)
QuickSort_HighLow(arr, pivot + 1, right);
您的分区函数将只执行一次,如果最小的在前,它将停止 for desc。您将其指定为枢轴,将其移到最后,计算 left==right, return length-1 并终止。这看起来像是快速排序的错误实现