我这个排序算法是以数组第一个元素为枢轴,为了解决遇到与枢轴有相同值,导致快排进入死循环的情况,例如
{-9,78,0,23,-9,-567,70},我在判断arr[ l ]与arr[ r ]与枢轴pivot之间大小时,加了个=,可以这样解决吗?
public static void quickSort(int[] arr, int left, int right){
if (left < right){
int pivot = arr[left];
int l = left;
int r = right;
int temp;
while (l < r){
while (l < r && arr[r] >= pivot){
r--;
}
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
while (l < r && arr[l] <= pivot){
l++;
}
temp = arr[l];
arr[l] = arr[r];
arr[r] = temp;
}
quickSort(arr,left,l - 1);
quickSort(arr,l + 1,right);
}
}
是的,这样可以解决当数组出现相同值时,让快排不进入死循环的问题。就是把代码中 arr[r]>pivot 改成 arr[r] >= pivot,加上一个等号,表示当arr[r]等于pivot的时候,也需要将枢轴的值放到数组的左边。
public static void quickSort(int[] arr, int left, int right){
if (left < right && right - left > 0){
int pivot = arr[left];
int l = left;
int r = right;
int temp;
while (l < r){
while (l < r && arr[r] >= pivot){ //注意这里加了等号
r--;
}
temp = arr[l];
arr[l++] = arr[r];
arr[r] = temp;
while (l < r && arr[l] <= pivot){
l++;
}
temp = arr[r];
arr[r--] = arr[l];
arr[l] = temp;
}
arr[l] = pivot;
quickSort(arr, left, l - 1);
quickSort(arr, l + 1, right);
}
}
不知道你这个问题是否已经解决, 如果还没有解决的话: