Java 快速排序算法

标签 java algorithm sorting quicksort

我正在尝试学习快速排序算法,这是我目前的代码:

import java.util.Arrays;

public class JavaFiddle {
    static int[] myArray = new int[]{35, 12, 25, 1, 5, 33, 56};

    public static void QuickSort(int[] array) {
        QuickSort(array, 0, array.length - 1);
    }

    public static void QuickSort(int[] array, int left, int right) {
        if (left < right) {
            int pivot = left + ((right - left) / 2);
            int index = partition(array, left, right, pivot);
            QuickSort(array, left, index - 1);
            QuickSort(array, index + 1, right);
        }
    }

    public static int partition(int[] array, int left, int right, int pivot) {
        while (left < right) {
            while (array[left] < pivot) {
                left++;
            }
            while (array[right] > pivot) {
                right--;
            }
            if (left < right) {
                swap(array, left, right);
                left++;
                right--;
            }
        }
        return left;
    }

    public static void swap(int[] array, int left, int right) {
        int temp = array[left];
        array[left] = array[right];
        array[right] = temp;
    }

    public static void main(String[] args) {
        System.out.println(Arrays.toString(myArray));
        QuickSort(myArray);
        System.out.println(Arrays.toString(myArray));
    }
}
但是,这段代码给了我一个不正确的结果:
[35, 12, 25, 1, 5, 33, 56] - before sort
[1, 12, 25, 35, 5, 33, 56] - after sort
我在这里有什么问题?我找不到逻辑上的缺陷。

最佳答案

这里有多个错误,
您在 main 方法中定义了枢轴,但快速排序算法会将枢轴从右侧元素交换到中间元素。
您可以在 while 循环中编辑 while 循环中的左右值,这会导致左右值比枢轴小/高,并跳过一些交换。
这是没有您的 while { while { ... } } 的正确实现和正确的枢轴(从右到中)

import java.util.Arrays;
public class Main
{
    static int[] myArray = new int[] {35, 12, 25, 1, 5, 56, 33};
    public static void QuickSort(int[] array) {
        QuickSort(array, 0, array.length - 1);
    }
    public static void QuickSort(int[] array, int left, int right){
        if(left < right) {
            int index = partition(array, left, right);
            QuickSort(array, left, index - 1);
            QuickSort(array, index + 1, right);
        }
    }
    public static int partition(int[] array, int left, int right){
        int pivot = array[right];
        int first = left - 1;
        for (int j = left; j <= right - 1; j++) {
            if(array[j] < pivot) {
                first ++;
                swap(array, first, j);
            }
        }
        swap(array, first + 1, right);
        return first + 1;
    }
    public static void swap(int[] array, int left, int right) {
        int temp = array[left];
        array[left] = array[right];
        array[right] = temp;
    }
    public static void main(String[] args)
    {
        System.out.println(Arrays.toString(myArray));
        QuickSort(myArray);
        System.out.println(Arrays.toString(myArray));
    }
}
还你比较pivot这是一个带有 array[...] 的索引这是一个值

关于Java 快速排序算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63811293/

相关文章:

java - 我如何告诉快速排序算法它应该终止?

java - 是否有标准化的站点地图格式?

algorithm - 调整图像大小以包含恰好 120 像素,并尽可能保持纵横比

algorithm - 如何计算 32 位整数中设置的位数?

c# - 使用 LINQ 进行字母数字排序

java - 按顺序将字符串添加到数组列表

java - 如何用IntelliJ IDEA创建jni头文件

Java Tomcat 应用程序以错误的时区将时间戳保存到数据库

python - 汉明距离的倒数

python - 高效的一维数组比较、缩放和求和