• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Sortowanie- Bubble, Quick, Insertion- porówanie czasów

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
0 głosów
206 wizyt
pytanie zadane 2 kwietnia 2020 w Java przez marzena12345 Użytkownik (770 p.)

Witam, porównuję czasy sortowania poszczególnych algorytmów i z tego co się orientuję to QuickSort powinno być najszybsze .. natomiast u mnie najlepiej wypada Insertion Sort. Może mam coś nie tak z algorytmem Quick?

import java.util.Random;

public class Main {

    public static void main(String[] args) {
        Random random = new Random();
        int[] arrayToSort = new int[10000];
        int[] unsortedArray;
        for (int i = 0; i < 10000; i++) {
            arrayToSort[i] = random.nextInt(10000);
            System.out.print(arrayToSort[i] + ", ");
        }
        unsortedArray = arrayToSort;
        System.out.println(" ");
        System.out.println("---------------");
        long timeBeforeBubbleSort = System.nanoTime();
        arrayBubbleSort(arrayToSort);
        long timeAfterBubbleSort = System.nanoTime();
        System.out.println("Bubble sort: ");
        for (int sort : arrayToSort) {
            System.out.print(sort + ", ");
        }
        System.out.println(" ");
        System.out.println("Czas sortowania bąbelkowego: " + calculateTimeOfSorting(timeBeforeBubbleSort, timeAfterBubbleSort)
        );
        arrayToSort = unsortedArray;
        System.out.println("---------------");
        long timeBeforeInsertionSort = System.nanoTime();
        arrayInsertionSort(arrayToSort);
        long timeAfterInsertionSort = System.nanoTime();
        System.out.println("Insertion sort: ");
        for (int sort : arrayToSort) {
            System.out.print(sort + ", ");
        }
        System.out.println(" ");
        System.out.println("Czas sortowania przez  wstawianie: " + calculateTimeOfSorting(timeBeforeInsertionSort, timeAfterInsertionSort));
        arrayToSort = unsortedArray;
        System.out.println("---------------");
        long timeBeforeQuickSort = System.nanoTime();
        arrayQuickSort(arrayToSort, 0, arrayToSort.length - 1);
        long timeAfterQuickSort = System.nanoTime();
        System.out.println("Quick sort: ");
        for (int sort : arrayToSort) {
            System.out.print(sort + ", ");
        }
        System.out.println(" ");
        System.out.println("Czas sortowania szybkiego: " + calculateTimeOfSorting(timeBeforeQuickSort, timeAfterQuickSort));


    }

    public static void arrayBubbleSort(int[] arrayToSort) {
        for (int i = 0; i < arrayToSort.length; i++) {
            for (int j = 0; j < arrayToSort.length - 1; j++) {
                if (arrayToSort[j] > arrayToSort[j + 1]) {
                    int temp = arrayToSort[j];
                    arrayToSort[j] = arrayToSort[j + 1];
                    arrayToSort[j + 1] = temp;
                }
            }
        }
    }

    public static void arrayInsertionSort(int[] arrayToSort) {
        int currentNumber, otherIndex;
        for (int i = 1; i < arrayToSort.length; i++) {
            currentNumber = arrayToSort[i];
            otherIndex = i;
            while (otherIndex > 0 && currentNumber < arrayToSort[otherIndex - 1]) {
                arrayToSort[otherIndex] = arrayToSort[otherIndex - 1];
                otherIndex--;
            }
            arrayToSort[otherIndex] = currentNumber;
        }
    }

    public static void arrayQuickSort(int[] arrayToSort, int left, int right) {
        if (left >= right) {
            return;
        }
        int pivotValue = arrayToSort[right];
        int border = left - 1;
        int i = left;

        while (i < right) {
            if (arrayToSort[i] < pivotValue) {
                border++;
                if (border != i) {
                    int temp = arrayToSort[border];
                    arrayToSort[border] = arrayToSort[i];
                    arrayToSort[i] = temp;
                }
            }
            i++;
        }
        border++;
        if (border != right) {
            int temp = arrayToSort[border];
            arrayToSort[border] = arrayToSort[right];
            arrayToSort[right] = temp;
        }

        arrayQuickSort(arrayToSort, left, border - 1);
        arrayQuickSort(arrayToSort, border + 1, right);
    }

    public static long calculateTimeOfSorting(long timeBefore, long timeAfter) {
        long difference = timeAfter - timeBefore;
        long timeOfSortingToMicroseconds = (long) (difference* 0.001);
        return timeOfSortingToMicroseconds;

    }
}

 

komentarz 2 kwietnia 2020 przez Molester Bywalec (2,920 p.)
Jakby się czepiać czystych formalizmów to nie zawsze tak jest z tą szybkością algorytmów, to zależy od konkretnego przypadku tj. dla odpowiedniego porządku danych wejściowych najgorszy przypadek quicksorta (zlozonosc kwadratowa), może się okazać wolniejszy niż najlepszy przypadek insertsorta (liniowa). I tak dla np małych tablic quicksort jest faktycznie wolniejszy niż insertsort.

1 odpowiedź

0 głosów
odpowiedź 2 kwietnia 2020 przez adrian17 Mentor (354,120 p.)

Nie wnikałem w szczegóły, ale... na oko wszędzie poza pierwszym razem "sortujesz" już posortowaną tablicę.

Konkretniej:

unsortedArray = arrayToSort;
arrayBubbleSort(arrayToSort);

unsortedArray i arrayToSort to ta sama tablica. unsortedArray też staje się posortowane.

komentarz 2 kwietnia 2020 przez marzena12345 Użytkownik (770 p.)
dzięki, zrobiłam to w inny sposób (przypisanie tablicy arrayToSort do 3 różnych tablic za pomocą pętli) i w ten sposób nie sortuję posortowanych tablic. Przy okazji mój problem z czasem też się rozwiązał, nie do końca rozumiem dlaczego ale działa :)
komentarz 2 kwietnia 2020 przez adrian17 Mentor (354,120 p.)

przypisanie tablicy arrayToSort do 3 różnych tablic za pomocą pętli

(można było też po prostu skopiować tablice używając .clone())

komentarz 2 kwietnia 2020 przez marzena12345 Użytkownik (770 p.)
nie znałam tej opcji, spróbuję. dzięki

Podobne pytania

0 głosów
2 odpowiedzi 576 wizyt
pytanie zadane 6 kwietnia 2016 w C i C++ przez k171 Nowicjusz (120 p.)
0 głosów
1 odpowiedź 938 wizyt

93,444 zapytań

142,436 odpowiedzi

322,698 komentarzy

62,806 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

...