【数据结构】快速排序:
问题描述
在写快速排序时,遇到了很多bug,调试了一上午,终于解决,在此记录一下遇到的bug以及解决方案。
下面是修正完好的快排代码:
public static void quickSortS2L(int[] arr, int left, int right) {
if (left > right) { //关键
return;
}
// if (left < right) {//随机选中某个数 并将其移动至数组最后一位
int random = (int) (left + Math.random() * (right - left + 1));
swap(arr, random, right);
// {-1, 10, 9, 9, 1293, 223, -2, 9};
int[] d = partition(arr, left, right);
quickSortS2L(arr, left, d[0]);
quickSortS2L(arr, d[1], right);
// }
}
public static int[] partition(int[] arr, int left, int right) {
int less = left - 1;
int bigger = right;
int p = left;
while (p < bigger) {
if (arr[p] < arr[right]) {//当前数值小于指定的数值
swap(arr, p, less + 1);
less++;
p++;
} else if (arr[p] > arr[right]) {//当前数值大于于指定的数值
swap(arr, p, bigger - 1);
bigger--;
} else {//当前数值等于于指定的数值
p++;
}
}
swap(arr, p, right);
bigger++;
return new int[]{less, bigger};
}
//交换数组中的两个数值
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
bug1:
快排之后,得到的部分元素为0(而原数组中并没有0元素),分析之后得到原因所在:将数组中两个位置处的元素进行交换的swap函数使用的是异或方法进行交换,而这种方法不适用于交换同一位置处的元素;
//交换数组中的两个数值
public static void swap(int[] arr, int i, int j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
}
解决方案:
重写swap方法,使用最简单的交换方式:
//交换数组中的两个数值
public static void swap(int[] arr, int i, int j) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
bug2:
qickSort算法判断退出条件很关键:left >= right,或者left>right
if (left >= right) {
return;
}