我正在迭代地实现我自己的快速排序并使用递归。
第一个分区很好,其中枢轴右侧的数字大于左侧,而左侧的数字小于。
但是我的分区似乎没有分区右侧而只分区左侧。
int[] data = {3,5,2,7,11,9,1,88,22};
public void qSort(int[] data, int left, int right){
int pivot = partition(data,left,right);
pivot = partition(data,pivot,data.length-1); // Test example for right side only
}
public int partition(int[] data, int left, int right){
int pivot = left;
left++;
while (left <= right){
while ((left <= right) && (data[left] <= data[pivot])) {
left++;
}
while ((left <= right) && (data[right] >= data[pivot])){
right--;
}
if (left < right){
int temp = data[left];
data[left] = data[right];
data[right] = temp;
left++;
right--;
}
}
if (data[right] < data[pivot]){
int temp = data[right];
data[right] = data[pivot];
data[pivot] = temp;
pivot = right;
}
return pivot;
}
任何帮助将不胜感激,我很难过:(
答案 0 :(得分:0)
实际上您的分区实现正常,您将错误的left
参数传递给partition
:
pivot = partition(data, pivot, data.length - 1); // Test example for right side only
应该是:
pivot = partition(data, pivot + 1, data.length - 1); // You need to exclude the pivot itself.
因为在您的实现中,您选择最左侧的元素作为数据透视表,所以当您尝试对正确的部分进行分区时,如果您将pivot
作为left
参数传递,那么一切都将保持不变,因为它已经是分配。