【数据结构】快速排序

【数据结构】快速排序:


问题描述

在写快速排序时,遇到了很多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;
 }

你可能感兴趣的:(数据结构,java)