Всегда ли эта реализация быстрой сортировки правильно выбирает последний элемент массива в качестве опорного?

public class lab3q3 {

    public static void main(String args[]) {
        int[] array = {8, 2, 5, 3, 9, 4, 7, 6, 1};

        quickSort(array, 0, array.length - 1);

        for (int i : array) {
            System.out.print(i + " ");
        }
    }

    private static void quickSort(int[] array, int start, int end) {
        if (end <= start) return; // Base case

        int pivotIndex = partition(array, start, end);
        quickSort(array, start, pivotIndex - 1);
        quickSort(array, pivotIndex + 1, end);
    }

    private static int partition(int[] array, int start, int end) {
        int pivotValue = array[end]; // Choose the last element as the pivot
        int i = start - 1;

        for (int j = start; j <= end; j++) {
            if (array[j] <= pivotValue) {
                i++;
                int temp = array[i];
                array[i] = array[j];
                array[j] = temp;
            }
        }

        return i;
    }
}
0
Hassan Awan 30 Окт 2023 в 06:10
У вас есть оператор, который принимает последний элемент в качестве опорного с комментарием рядом с ним. Что заставляет вас сомневаться? Почему этот вопрос?
 – 
trincot
30 Окт 2023 в 10:59

2 ответа

Да, код правильный в соответствии с реализацией алгоритма быстрой сортировки и также выбирает последний элемент в качестве опорного.

Однако это может повлиять на эффективность вашего алгоритма в тех случаях, когда входной массив уже отсортирован или почти отсортирован, стремясь к сложности O(n²). Учитывайте это при выборе опорного элемента, будь то первый элемент массива, средний элемент или случайный элемент.

0
Nathan Pereira 30 Окт 2023 в 06:46

Добавить случайный

 public static void main(String args[]) {
    int[] array = {8, 2, 5, 3, 9, 4, 7, 6, 1,9};

    quickSort(array, 0, array.length - 1);

    for (int i : array) {
        System.out.print(i + " ");
    }
}

private static void quickSort(int[] array, int start, int end) {
    if (end <= start) return; // Base case

    int pivotIndex = partition(array, start, end);
    quickSort(array, start, pivotIndex - 1);
    quickSort(array, pivotIndex + 1, end);
}

private static int partition(int[] array, int start, int end) {
    int random = start+((int) ((end-start) * Math.random()));
    int cur =array[random];
    array[random] = array[end];
    array[end] = cur;

    int pivotValue = array[end]; // Choose the last element as the pivot
    int i = start - 1;

    for (int j = start; j <= end; j++) {
        if (array[j] <= pivotValue) {
            i++;
            int temp = array[i];
            array[i] = array[j];
            array[j] = temp;
        }
    }

    return i;
}
-1
kunli 30 Окт 2023 в 08:40
2
Это не отвечает на вопрос о правильности.
 – 
greybeard
30 Окт 2023 в 10:02
Как сейчас написано, ваш ответ неясен. Пожалуйста, измените, чтобы добавить дополнительные сведения, которые помогут другим понять, как это отвечает на заданный вопрос. Дополнительную информацию о том, как писать хорошие ответы, можно найти в Справочном центре.
 – 
Community
30 Окт 2023 в 12:48